{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "uvIOSdCSgMWw"
      },
      "source": [
        "对应 `tf.keras` 的01~02章节"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-14T08:03:35.947423Z",
          "start_time": "2025-01-14T08:03:29.081766Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "VOs25Y8ygMWx",
        "outputId": "fc13e261-c116-4005-9a65-e546cbd01b94"
      },
      "source": [
        "import matplotlib as mpl\n",
        "import matplotlib.pyplot as plt\n",
        "%matplotlib inline\n",
        "import numpy as np\n",
        "import sklearn\n",
        "import pandas as pd\n",
        "import os\n",
        "import sys\n",
        "import time\n",
        "from tqdm.auto import tqdm\n",
        "import torch\n",
        "import torch.nn as nn\n",
        "import torch.nn.functional as F\n",
        "\n",
        "print(sys.version_info)\n",
        "for module in mpl, np, pd, sklearn, torch:\n",
        "    print(module.__name__, module.__version__)\n",
        "\n",
        "device = torch.device(\"cuda:0\") if torch.cuda.is_available() else torch.device(\"cpu\")\n",
        "print(device)\n"
      ],
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "sys.version_info(major=3, minor=10, micro=12, releaselevel='final', serial=0)\n",
            "matplotlib 3.8.0\n",
            "numpy 1.26.4\n",
            "pandas 2.2.2\n",
            "sklearn 1.6.0\n",
            "torch 2.5.1+cu121\n",
            "cuda:0\n"
          ]
        }
      ],
      "execution_count": 2
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "784"
            ]
          },
          "metadata": {},
          "execution_count": 2
        }
      ],
      "source": [
        "28*28"
      ],
      "metadata": {
        "ExecuteTime": {
          "end_time": "2024-07-17T03:06:30.417590400Z",
          "start_time": "2024-07-17T03:06:30.410095400Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "b5f_hap2gMWy",
        "outputId": "51b9e5fb-b51e-459b-8210-1a333fddf3cc"
      }
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "AAqODl-GgMWy"
      },
      "source": [
        "## 数据准备"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-14T08:16:06.281193Z",
          "start_time": "2025-01-14T08:16:06.249135Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "kowsdk57gMWy",
        "outputId": "b946d64f-6a19-4a1c-9a52-d64097226c89"
      },
      "source": [
        "from torchvision import datasets\n",
        "from torchvision.transforms import ToTensor\n",
        "from torchvision import transforms\n",
        "\n",
        "\n",
        "# 定义数据集的变换\n",
        "transform = transforms.Compose([\n",
        "    transforms.ToTensor(), # 转换为tensor，进行归一化\n",
        "    # transforms.Normalize(mean, std) # 标准化，mean和std是数据集的均值和方差\n",
        "])\n",
        "# fashion_mnist图像分类数据集，衣服分类，60000张训练图片，10000张测试图片\n",
        "train_ds = datasets.FashionMNIST(\n",
        "    root=\"data\",\n",
        "    train=True,\n",
        "    download=True,\n",
        "    transform=transform\n",
        ")\n",
        "\n",
        "test_ds = datasets.FashionMNIST(\n",
        "    root=\"data\",\n",
        "    train=False,\n",
        "    download=True,\n",
        "    transform=transform\n",
        ")\n",
        "\n",
        "# torchvision 数据集里没有提供训练集和验证集的划分\n",
        "# 当然也可以用 torch.utils.data.Dataset 实现人为划分"
      ],
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Downloading http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/train-images-idx3-ubyte.gz\n",
            "Downloading http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/train-images-idx3-ubyte.gz to data/FashionMNIST/raw/train-images-idx3-ubyte.gz\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "100%|██████████| 26.4M/26.4M [00:02<00:00, 12.6MB/s]\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Extracting data/FashionMNIST/raw/train-images-idx3-ubyte.gz to data/FashionMNIST/raw\n",
            "\n",
            "Downloading http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/train-labels-idx1-ubyte.gz\n",
            "Downloading http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/train-labels-idx1-ubyte.gz to data/FashionMNIST/raw/train-labels-idx1-ubyte.gz\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "100%|██████████| 29.5k/29.5k [00:00<00:00, 198kB/s]\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Extracting data/FashionMNIST/raw/train-labels-idx1-ubyte.gz to data/FashionMNIST/raw\n",
            "\n",
            "Downloading http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/t10k-images-idx3-ubyte.gz\n",
            "Downloading http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/t10k-images-idx3-ubyte.gz to data/FashionMNIST/raw/t10k-images-idx3-ubyte.gz\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "100%|██████████| 4.42M/4.42M [00:01<00:00, 3.65MB/s]\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Extracting data/FashionMNIST/raw/t10k-images-idx3-ubyte.gz to data/FashionMNIST/raw\n",
            "\n",
            "Downloading http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/t10k-labels-idx1-ubyte.gz\n",
            "Downloading http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/t10k-labels-idx1-ubyte.gz to data/FashionMNIST/raw/t10k-labels-idx1-ubyte.gz\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "100%|██████████| 5.15k/5.15k [00:00<00:00, 16.6MB/s]"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Extracting data/FashionMNIST/raw/t10k-labels-idx1-ubyte.gz to data/FashionMNIST/raw\n",
            "\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "\n"
          ]
        }
      ],
      "execution_count": 3
    },
    {
      "cell_type": "code",
      "source": [
        "type(train_ds)"
      ],
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-14T08:16:08.451765Z",
          "start_time": "2025-01-14T08:16:08.449186Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 204
        },
        "id": "qTQmXrHqgMWy",
        "outputId": "8e251037-fab0-4a42-bdd0-b9e65509e101"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "torchvision.datasets.mnist.FashionMNIST"
            ],
            "text/html": [
              "<div style=\"max-width:800px; border: 1px solid var(--colab-border-color);\"><style>\n",
              "      pre.function-repr-contents {\n",
              "        overflow-x: auto;\n",
              "        padding: 8px 12px;\n",
              "        max-height: 500px;\n",
              "      }\n",
              "\n",
              "      pre.function-repr-contents.function-repr-contents-collapsed {\n",
              "        cursor: pointer;\n",
              "        max-height: 100px;\n",
              "      }\n",
              "    </style>\n",
              "    <pre style=\"white-space: initial; background:\n",
              "         var(--colab-secondary-surface-color); padding: 8px 12px;\n",
              "         border-bottom: 1px solid var(--colab-border-color);\"><b>torchvision.datasets.mnist.FashionMNIST</b><br/>def __init__(root: Union[str, Path], train: bool=True, transform: Optional[Callable]=None, target_transform: Optional[Callable]=None, download: bool=False) -&gt; None</pre><pre class=\"function-repr-contents function-repr-contents-collapsed\" style=\"\"><a class=\"filepath\" style=\"display:none\" href=\"#\">/usr/local/lib/python3.10/dist-packages/torchvision/datasets/mnist.py</a>`Fashion-MNIST &lt;https://github.com/zalandoresearch/fashion-mnist&gt;`_ Dataset.\n",
              "\n",
              "Args:\n",
              "    root (str or ``pathlib.Path``): Root directory of dataset where ``FashionMNIST/raw/train-images-idx3-ubyte``\n",
              "        and  ``FashionMNIST/raw/t10k-images-idx3-ubyte`` exist.\n",
              "    train (bool, optional): If True, creates dataset from ``train-images-idx3-ubyte``,\n",
              "        otherwise from ``t10k-images-idx3-ubyte``.\n",
              "    download (bool, optional): If True, downloads the dataset from the internet and\n",
              "        puts it in root directory. If dataset is already downloaded, it is not\n",
              "        downloaded again.\n",
              "    transform (callable, optional): A function/transform that  takes in a PIL image\n",
              "        and returns a transformed version. E.g, ``transforms.RandomCrop``\n",
              "    target_transform (callable, optional): A function/transform that takes in the\n",
              "        target and transforms it.</pre>\n",
              "      <script>\n",
              "      if (google.colab.kernel.accessAllowed && google.colab.files && google.colab.files.view) {\n",
              "        for (const element of document.querySelectorAll('.filepath')) {\n",
              "          element.style.display = 'block'\n",
              "          element.onclick = (event) => {\n",
              "            event.preventDefault();\n",
              "            event.stopPropagation();\n",
              "            google.colab.files.view(element.textContent, 203);\n",
              "          };\n",
              "        }\n",
              "      }\n",
              "      for (const element of document.querySelectorAll('.function-repr-contents')) {\n",
              "        element.onclick = (event) => {\n",
              "          event.preventDefault();\n",
              "          event.stopPropagation();\n",
              "          element.classList.toggle('function-repr-contents-collapsed');\n",
              "        };\n",
              "      }\n",
              "      </script>\n",
              "      </div>"
            ]
          },
          "metadata": {},
          "execution_count": 4
        }
      ],
      "execution_count": 4
    },
    {
      "cell_type": "code",
      "source": [
        "len(train_ds)"
      ],
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-14T08:10:16.563211Z",
          "start_time": "2025-01-14T08:10:16.559761Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "ax-DZAnWgMWz",
        "outputId": "92c416d3-8a17-4c3f-abcb-41e8805308f3"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "60000"
            ]
          },
          "metadata": {},
          "execution_count": 5
        }
      ],
      "execution_count": 5
    },
    {
      "cell_type": "code",
      "source": [
        "type(train_ds[0])"
      ],
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-14T08:16:15.040974Z",
          "start_time": "2025-01-14T08:16:15.037974Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "RlFv1aZygMWz",
        "outputId": "ce9246ce-b52c-4540-8216-74729ef473c1"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "tuple"
            ]
          },
          "metadata": {},
          "execution_count": 6
        }
      ],
      "execution_count": 6
    },
    {
      "cell_type": "code",
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-14T08:16:18.671924Z",
          "start_time": "2025-01-14T08:16:18.635277Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "Jiv6sGgfgMWz",
        "outputId": "30541612-8f93-4460-ebc9-2e3689e57fc6"
      },
      "source": [
        "# 通过id取数据，取到的是一个元祖,是第一个样本,在训练时，把特征和标签分开\n",
        "img, label = train_ds[0]\n",
        "img.shape\n",
        "# img.shape = (1, 28, 28)，这是因为通道数在最前面"
      ],
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "torch.Size([1, 28, 28])"
            ]
          },
          "metadata": {},
          "execution_count": 5
        }
      ],
      "execution_count": 5
    },
    {
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-14T08:16:31.733705Z",
          "start_time": "2025-01-14T08:16:31.729732Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "0D_0w4K2gMWz",
        "outputId": "ef6ac045-35b2-4240-9be2-96ce9e3a79f5"
      },
      "cell_type": "code",
      "source": [
        "type(img) #tensor中文是 张量,和numpy的ndarray类似"
      ],
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "torch.Tensor"
            ]
          },
          "metadata": {},
          "execution_count": 8
        }
      ],
      "execution_count": 8
    },
    {
      "cell_type": "code",
      "source": [
        "img[0]"
      ],
      "metadata": {
        "collapsed": true,
        "ExecuteTime": {
          "end_time": "2025-01-14T08:13:38.479618Z",
          "start_time": "2025-01-14T08:13:38.475341Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "hHWXNSx7gMWz",
        "outputId": "9e9f11cf-ab8c-4153-ccd4-7480db658179"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "tensor([[0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "         0.0000],\n",
              "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "         0.0000],\n",
              "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "         0.0000],\n",
              "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "         0.0000, 0.0000, 0.0000, 0.0039, 0.0000, 0.0000, 0.0510, 0.2863, 0.0000,\n",
              "         0.0000, 0.0039, 0.0157, 0.0000, 0.0000, 0.0000, 0.0000, 0.0039, 0.0039,\n",
              "         0.0000],\n",
              "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "         0.0000, 0.0000, 0.0000, 0.0118, 0.0000, 0.1412, 0.5333, 0.4980, 0.2431,\n",
              "         0.2118, 0.0000, 0.0000, 0.0000, 0.0039, 0.0118, 0.0157, 0.0000, 0.0000,\n",
              "         0.0118],\n",
              "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "         0.0000, 0.0000, 0.0000, 0.0235, 0.0000, 0.4000, 0.8000, 0.6902, 0.5255,\n",
              "         0.5647, 0.4824, 0.0902, 0.0000, 0.0000, 0.0000, 0.0000, 0.0471, 0.0392,\n",
              "         0.0000],\n",
              "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.6078, 0.9255, 0.8118, 0.6980,\n",
              "         0.4196, 0.6118, 0.6314, 0.4275, 0.2510, 0.0902, 0.3020, 0.5098, 0.2824,\n",
              "         0.0588],\n",
              "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "         0.0000, 0.0000, 0.0039, 0.0000, 0.2706, 0.8118, 0.8745, 0.8549, 0.8471,\n",
              "         0.8471, 0.6392, 0.4980, 0.4745, 0.4784, 0.5725, 0.5529, 0.3451, 0.6745,\n",
              "         0.2588],\n",
              "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "         0.0039, 0.0039, 0.0039, 0.0000, 0.7843, 0.9098, 0.9098, 0.9137, 0.8980,\n",
              "         0.8745, 0.8745, 0.8431, 0.8353, 0.6431, 0.4980, 0.4824, 0.7686, 0.8980,\n",
              "         0.0000],\n",
              "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "         0.0000, 0.0000, 0.0000, 0.0000, 0.7176, 0.8824, 0.8471, 0.8745, 0.8941,\n",
              "         0.9216, 0.8902, 0.8784, 0.8706, 0.8784, 0.8667, 0.8745, 0.9608, 0.6784,\n",
              "         0.0000],\n",
              "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "         0.0000, 0.0000, 0.0000, 0.0000, 0.7569, 0.8941, 0.8549, 0.8353, 0.7765,\n",
              "         0.7059, 0.8314, 0.8235, 0.8275, 0.8353, 0.8745, 0.8627, 0.9529, 0.7922,\n",
              "         0.0000],\n",
              "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "         0.0039, 0.0118, 0.0000, 0.0471, 0.8588, 0.8627, 0.8314, 0.8549, 0.7529,\n",
              "         0.6627, 0.8902, 0.8157, 0.8549, 0.8784, 0.8314, 0.8863, 0.7725, 0.8196,\n",
              "         0.2039],\n",
              "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "         0.0000, 0.0235, 0.0000, 0.3882, 0.9569, 0.8706, 0.8627, 0.8549, 0.7961,\n",
              "         0.7765, 0.8667, 0.8431, 0.8353, 0.8706, 0.8627, 0.9608, 0.4667, 0.6549,\n",
              "         0.2196],\n",
              "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "         0.0157, 0.0000, 0.0000, 0.2157, 0.9255, 0.8941, 0.9020, 0.8941, 0.9412,\n",
              "         0.9098, 0.8353, 0.8549, 0.8745, 0.9176, 0.8510, 0.8510, 0.8196, 0.3608,\n",
              "         0.0000],\n",
              "        [0.0000, 0.0000, 0.0039, 0.0157, 0.0235, 0.0275, 0.0078, 0.0000, 0.0000,\n",
              "         0.0000, 0.0000, 0.0000, 0.9294, 0.8863, 0.8510, 0.8745, 0.8706, 0.8588,\n",
              "         0.8706, 0.8667, 0.8471, 0.8745, 0.8980, 0.8431, 0.8549, 1.0000, 0.3020,\n",
              "         0.0000],\n",
              "        [0.0000, 0.0118, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "         0.2431, 0.5686, 0.8000, 0.8941, 0.8118, 0.8353, 0.8667, 0.8549, 0.8157,\n",
              "         0.8275, 0.8549, 0.8784, 0.8745, 0.8588, 0.8431, 0.8784, 0.9569, 0.6235,\n",
              "         0.0000],\n",
              "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0706, 0.1725, 0.3216, 0.4196, 0.7412,\n",
              "         0.8941, 0.8627, 0.8706, 0.8510, 0.8863, 0.7843, 0.8039, 0.8275, 0.9020,\n",
              "         0.8784, 0.9176, 0.6902, 0.7373, 0.9804, 0.9725, 0.9137, 0.9333, 0.8431,\n",
              "         0.0000],\n",
              "        [0.0000, 0.2235, 0.7333, 0.8157, 0.8784, 0.8667, 0.8784, 0.8157, 0.8000,\n",
              "         0.8392, 0.8157, 0.8196, 0.7843, 0.6235, 0.9608, 0.7569, 0.8078, 0.8745,\n",
              "         1.0000, 1.0000, 0.8667, 0.9176, 0.8667, 0.8275, 0.8627, 0.9098, 0.9647,\n",
              "         0.0000],\n",
              "        [0.0118, 0.7922, 0.8941, 0.8784, 0.8667, 0.8275, 0.8275, 0.8392, 0.8039,\n",
              "         0.8039, 0.8039, 0.8627, 0.9412, 0.3137, 0.5882, 1.0000, 0.8980, 0.8667,\n",
              "         0.7373, 0.6039, 0.7490, 0.8235, 0.8000, 0.8196, 0.8706, 0.8941, 0.8824,\n",
              "         0.0000],\n",
              "        [0.3843, 0.9137, 0.7765, 0.8235, 0.8706, 0.8980, 0.8980, 0.9176, 0.9765,\n",
              "         0.8627, 0.7608, 0.8431, 0.8510, 0.9451, 0.2549, 0.2863, 0.4157, 0.4588,\n",
              "         0.6588, 0.8588, 0.8667, 0.8431, 0.8510, 0.8745, 0.8745, 0.8784, 0.8980,\n",
              "         0.1137],\n",
              "        [0.2941, 0.8000, 0.8314, 0.8000, 0.7569, 0.8039, 0.8275, 0.8824, 0.8471,\n",
              "         0.7255, 0.7725, 0.8078, 0.7765, 0.8353, 0.9412, 0.7647, 0.8902, 0.9608,\n",
              "         0.9373, 0.8745, 0.8549, 0.8314, 0.8196, 0.8706, 0.8627, 0.8667, 0.9020,\n",
              "         0.2627],\n",
              "        [0.1882, 0.7961, 0.7176, 0.7608, 0.8353, 0.7725, 0.7255, 0.7451, 0.7608,\n",
              "         0.7529, 0.7922, 0.8392, 0.8588, 0.8667, 0.8627, 0.9255, 0.8824, 0.8471,\n",
              "         0.7804, 0.8078, 0.7294, 0.7098, 0.6941, 0.6745, 0.7098, 0.8039, 0.8078,\n",
              "         0.4510],\n",
              "        [0.0000, 0.4784, 0.8588, 0.7569, 0.7020, 0.6706, 0.7176, 0.7686, 0.8000,\n",
              "         0.8235, 0.8353, 0.8118, 0.8275, 0.8235, 0.7843, 0.7686, 0.7608, 0.7490,\n",
              "         0.7647, 0.7490, 0.7765, 0.7529, 0.6902, 0.6118, 0.6549, 0.6941, 0.8235,\n",
              "         0.3608],\n",
              "        [0.0000, 0.0000, 0.2902, 0.7412, 0.8314, 0.7490, 0.6863, 0.6745, 0.6863,\n",
              "         0.7098, 0.7255, 0.7373, 0.7412, 0.7373, 0.7569, 0.7765, 0.8000, 0.8196,\n",
              "         0.8235, 0.8235, 0.8275, 0.7373, 0.7373, 0.7608, 0.7529, 0.8471, 0.6667,\n",
              "         0.0000],\n",
              "        [0.0078, 0.0000, 0.0000, 0.0000, 0.2588, 0.7843, 0.8706, 0.9294, 0.9373,\n",
              "         0.9490, 0.9647, 0.9529, 0.9569, 0.8667, 0.8627, 0.7569, 0.7490, 0.7020,\n",
              "         0.7137, 0.7137, 0.7098, 0.6902, 0.6510, 0.6588, 0.3882, 0.2275, 0.0000,\n",
              "         0.0000],\n",
              "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.1569, 0.2392,\n",
              "         0.1725, 0.2824, 0.1608, 0.1373, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "         0.0000],\n",
              "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "         0.0000],\n",
              "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "         0.0000]])"
            ]
          },
          "metadata": {},
          "execution_count": 9
        }
      ],
      "execution_count": 9
    },
    {
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-14T08:16:50.708516Z",
          "start_time": "2025-01-14T08:16:50.682030Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "collapsed": true,
        "id": "upNbRjwzgMWz",
        "outputId": "b6a569e0-7694-4c20-c57e-55c539d578ba"
      },
      "cell_type": "code",
      "source": [
        "img"
      ],
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "tensor([[[0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "          0.0000, 0.0000, 0.0000, 0.0000],\n",
              "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "          0.0000, 0.0000, 0.0000, 0.0000],\n",
              "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "          0.0000, 0.0000, 0.0000, 0.0000],\n",
              "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "          0.0000, 0.0000, 0.0000, 0.0000, 0.0039, 0.0000, 0.0000, 0.0510,\n",
              "          0.2863, 0.0000, 0.0000, 0.0039, 0.0157, 0.0000, 0.0000, 0.0000,\n",
              "          0.0000, 0.0039, 0.0039, 0.0000],\n",
              "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "          0.0000, 0.0000, 0.0000, 0.0000, 0.0118, 0.0000, 0.1412, 0.5333,\n",
              "          0.4980, 0.2431, 0.2118, 0.0000, 0.0000, 0.0000, 0.0039, 0.0118,\n",
              "          0.0157, 0.0000, 0.0000, 0.0118],\n",
              "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "          0.0000, 0.0000, 0.0000, 0.0000, 0.0235, 0.0000, 0.4000, 0.8000,\n",
              "          0.6902, 0.5255, 0.5647, 0.4824, 0.0902, 0.0000, 0.0000, 0.0000,\n",
              "          0.0000, 0.0471, 0.0392, 0.0000],\n",
              "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.6078, 0.9255,\n",
              "          0.8118, 0.6980, 0.4196, 0.6118, 0.6314, 0.4275, 0.2510, 0.0902,\n",
              "          0.3020, 0.5098, 0.2824, 0.0588],\n",
              "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "          0.0000, 0.0000, 0.0000, 0.0039, 0.0000, 0.2706, 0.8118, 0.8745,\n",
              "          0.8549, 0.8471, 0.8471, 0.6392, 0.4980, 0.4745, 0.4784, 0.5725,\n",
              "          0.5529, 0.3451, 0.6745, 0.2588],\n",
              "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "          0.0000, 0.0039, 0.0039, 0.0039, 0.0000, 0.7843, 0.9098, 0.9098,\n",
              "          0.9137, 0.8980, 0.8745, 0.8745, 0.8431, 0.8353, 0.6431, 0.4980,\n",
              "          0.4824, 0.7686, 0.8980, 0.0000],\n",
              "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.7176, 0.8824, 0.8471,\n",
              "          0.8745, 0.8941, 0.9216, 0.8902, 0.8784, 0.8706, 0.8784, 0.8667,\n",
              "          0.8745, 0.9608, 0.6784, 0.0000],\n",
              "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.7569, 0.8941, 0.8549,\n",
              "          0.8353, 0.7765, 0.7059, 0.8314, 0.8235, 0.8275, 0.8353, 0.8745,\n",
              "          0.8627, 0.9529, 0.7922, 0.0000],\n",
              "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "          0.0000, 0.0039, 0.0118, 0.0000, 0.0471, 0.8588, 0.8627, 0.8314,\n",
              "          0.8549, 0.7529, 0.6627, 0.8902, 0.8157, 0.8549, 0.8784, 0.8314,\n",
              "          0.8863, 0.7725, 0.8196, 0.2039],\n",
              "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "          0.0000, 0.0000, 0.0235, 0.0000, 0.3882, 0.9569, 0.8706, 0.8627,\n",
              "          0.8549, 0.7961, 0.7765, 0.8667, 0.8431, 0.8353, 0.8706, 0.8627,\n",
              "          0.9608, 0.4667, 0.6549, 0.2196],\n",
              "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "          0.0000, 0.0157, 0.0000, 0.0000, 0.2157, 0.9255, 0.8941, 0.9020,\n",
              "          0.8941, 0.9412, 0.9098, 0.8353, 0.8549, 0.8745, 0.9176, 0.8510,\n",
              "          0.8510, 0.8196, 0.3608, 0.0000],\n",
              "         [0.0000, 0.0000, 0.0039, 0.0157, 0.0235, 0.0275, 0.0078, 0.0000,\n",
              "          0.0000, 0.0000, 0.0000, 0.0000, 0.9294, 0.8863, 0.8510, 0.8745,\n",
              "          0.8706, 0.8588, 0.8706, 0.8667, 0.8471, 0.8745, 0.8980, 0.8431,\n",
              "          0.8549, 1.0000, 0.3020, 0.0000],\n",
              "         [0.0000, 0.0118, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "          0.0000, 0.2431, 0.5686, 0.8000, 0.8941, 0.8118, 0.8353, 0.8667,\n",
              "          0.8549, 0.8157, 0.8275, 0.8549, 0.8784, 0.8745, 0.8588, 0.8431,\n",
              "          0.8784, 0.9569, 0.6235, 0.0000],\n",
              "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0706, 0.1725, 0.3216, 0.4196,\n",
              "          0.7412, 0.8941, 0.8627, 0.8706, 0.8510, 0.8863, 0.7843, 0.8039,\n",
              "          0.8275, 0.9020, 0.8784, 0.9176, 0.6902, 0.7373, 0.9804, 0.9725,\n",
              "          0.9137, 0.9333, 0.8431, 0.0000],\n",
              "         [0.0000, 0.2235, 0.7333, 0.8157, 0.8784, 0.8667, 0.8784, 0.8157,\n",
              "          0.8000, 0.8392, 0.8157, 0.8196, 0.7843, 0.6235, 0.9608, 0.7569,\n",
              "          0.8078, 0.8745, 1.0000, 1.0000, 0.8667, 0.9176, 0.8667, 0.8275,\n",
              "          0.8627, 0.9098, 0.9647, 0.0000],\n",
              "         [0.0118, 0.7922, 0.8941, 0.8784, 0.8667, 0.8275, 0.8275, 0.8392,\n",
              "          0.8039, 0.8039, 0.8039, 0.8627, 0.9412, 0.3137, 0.5882, 1.0000,\n",
              "          0.8980, 0.8667, 0.7373, 0.6039, 0.7490, 0.8235, 0.8000, 0.8196,\n",
              "          0.8706, 0.8941, 0.8824, 0.0000],\n",
              "         [0.3843, 0.9137, 0.7765, 0.8235, 0.8706, 0.8980, 0.8980, 0.9176,\n",
              "          0.9765, 0.8627, 0.7608, 0.8431, 0.8510, 0.9451, 0.2549, 0.2863,\n",
              "          0.4157, 0.4588, 0.6588, 0.8588, 0.8667, 0.8431, 0.8510, 0.8745,\n",
              "          0.8745, 0.8784, 0.8980, 0.1137],\n",
              "         [0.2941, 0.8000, 0.8314, 0.8000, 0.7569, 0.8039, 0.8275, 0.8824,\n",
              "          0.8471, 0.7255, 0.7725, 0.8078, 0.7765, 0.8353, 0.9412, 0.7647,\n",
              "          0.8902, 0.9608, 0.9373, 0.8745, 0.8549, 0.8314, 0.8196, 0.8706,\n",
              "          0.8627, 0.8667, 0.9020, 0.2627],\n",
              "         [0.1882, 0.7961, 0.7176, 0.7608, 0.8353, 0.7725, 0.7255, 0.7451,\n",
              "          0.7608, 0.7529, 0.7922, 0.8392, 0.8588, 0.8667, 0.8627, 0.9255,\n",
              "          0.8824, 0.8471, 0.7804, 0.8078, 0.7294, 0.7098, 0.6941, 0.6745,\n",
              "          0.7098, 0.8039, 0.8078, 0.4510],\n",
              "         [0.0000, 0.4784, 0.8588, 0.7569, 0.7020, 0.6706, 0.7176, 0.7686,\n",
              "          0.8000, 0.8235, 0.8353, 0.8118, 0.8275, 0.8235, 0.7843, 0.7686,\n",
              "          0.7608, 0.7490, 0.7647, 0.7490, 0.7765, 0.7529, 0.6902, 0.6118,\n",
              "          0.6549, 0.6941, 0.8235, 0.3608],\n",
              "         [0.0000, 0.0000, 0.2902, 0.7412, 0.8314, 0.7490, 0.6863, 0.6745,\n",
              "          0.6863, 0.7098, 0.7255, 0.7373, 0.7412, 0.7373, 0.7569, 0.7765,\n",
              "          0.8000, 0.8196, 0.8235, 0.8235, 0.8275, 0.7373, 0.7373, 0.7608,\n",
              "          0.7529, 0.8471, 0.6667, 0.0000],\n",
              "         [0.0078, 0.0000, 0.0000, 0.0000, 0.2588, 0.7843, 0.8706, 0.9294,\n",
              "          0.9373, 0.9490, 0.9647, 0.9529, 0.9569, 0.8667, 0.8627, 0.7569,\n",
              "          0.7490, 0.7020, 0.7137, 0.7137, 0.7098, 0.6902, 0.6510, 0.6588,\n",
              "          0.3882, 0.2275, 0.0000, 0.0000],\n",
              "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.1569,\n",
              "          0.2392, 0.1725, 0.2824, 0.1608, 0.1373, 0.0000, 0.0000, 0.0000,\n",
              "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "          0.0000, 0.0000, 0.0000, 0.0000],\n",
              "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "          0.0000, 0.0000, 0.0000, 0.0000],\n",
              "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
              "          0.0000, 0.0000, 0.0000, 0.0000]]])"
            ]
          },
          "metadata": {},
          "execution_count": 10
        }
      ],
      "execution_count": 10
    },
    {
      "cell_type": "code",
      "execution_count": 6,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "(tensor([0.2860]), tensor([0.3205]))\n"
          ]
        }
      ],
      "source": [
        "#计算均值和方差\n",
        "def cal_mean_std(ds):\n",
        "    mean = 0.\n",
        "    std = 0.\n",
        "    for img, _ in ds: # 遍历每张图片,img.shape=[1,28,28]\n",
        "        mean += img.mean(dim=(1, 2))\n",
        "        std += img.std(dim=(1, 2))\n",
        "    mean /= len(ds)\n",
        "    std /= len(ds)\n",
        "    return mean, std\n",
        "\n",
        "\n",
        "print(cal_mean_std(train_ds))\n"
      ],
      "metadata": {
        "ExecuteTime": {
          "end_time": "2024-07-17T03:33:10.398820900Z",
          "start_time": "2024-07-17T03:32:58.998047400Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "Os82XyahgMW0",
        "outputId": "32c71414-7a30-44a8-f61f-1bdbb49e6cdb"
      }
    },
    {
      "cell_type": "code",
      "execution_count": 12,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "torch.Tensor"
            ]
          },
          "metadata": {},
          "execution_count": 12
        }
      ],
      "source": [
        "type(img)"
      ],
      "metadata": {
        "ExecuteTime": {
          "end_time": "2024-07-17T03:06:33.598821200Z",
          "start_time": "2024-07-17T03:06:33.540172Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "rR4sOi8ugMW0",
        "outputId": "2dfce50c-96ef-45db-a021-aff5677672be"
      }
    },
    {
      "cell_type": "code",
      "execution_count": 13,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "9"
            ]
          },
          "metadata": {},
          "execution_count": 13
        }
      ],
      "source": [
        "label"
      ],
      "metadata": {
        "ExecuteTime": {
          "end_time": "2024-07-17T03:06:33.599820400Z",
          "start_time": "2024-07-17T03:06:33.545914600Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "0sH4owaVgMW0",
        "outputId": "c4f58d36-d986-4b05-b478-f8e34bd4a664"
      }
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "outputs": [
        {
          "data": {
            "text/plain": "torch.Tensor"
          },
          "execution_count": 11,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "type(img) #tensor中文是张量,和numpy的ndarray类似"
      ],
      "metadata": {
        "ExecuteTime": {
          "end_time": "2024-07-17T03:06:33.600820300Z",
          "start_time": "2024-07-17T03:06:33.557907500Z"
        },
        "id": "IE7my4EVgMW0",
        "outputId": "f51214c0-89c2-4026-dc10-26f88b1a103d"
      }
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "outputs": [
        {
          "data": {
            "text/plain": "9"
          },
          "execution_count": 12,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "label"
      ],
      "metadata": {
        "ExecuteTime": {
          "end_time": "2024-07-17T03:06:33.601819800Z",
          "start_time": "2024-07-17T03:06:33.573680700Z"
        },
        "id": "hvVQGcREgMW0",
        "outputId": "45a3adbd-f6fc-42b2-bf0b-c105e8752d80"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "# 显示图片，这里需要把transforms.ToTensor(),进行归一化注释掉，否则是不行的\n",
        "def show_img_content(img):\n",
        "    from PIL import Image\n",
        "\n",
        "    # 打开一个图像文件\n",
        "    # img = Image.open(img)\n",
        "\n",
        "\n",
        "    print(\"图像大小:\", img.size)\n",
        "    print(\"图像模式:\", img.mode)\n",
        "\n",
        "\n",
        "    # 如果图像是单通道的，比如灰度图，你可以这样获取像素值列表：\n",
        "    if img.mode == 'L':\n",
        "        pixel_values = list(img.getdata())\n",
        "        print(pixel_values)\n",
        "show_img_content(img) #这里必须把上面的 transforms.ToTensor(), # 转换为tensor，进行归一化注释掉，否则是不行的"
      ],
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-14T08:17:45.718267Z",
          "start_time": "2025-01-14T08:17:45.714160Z"
        },
        "id": "4dpcB1sXgMW0",
        "outputId": "04a9cb19-9d1f-4f5e-f5cf-d8c7c8123fdb"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "图像大小: (28, 28)\n",
            "图像模式: L\n",
            "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 13, 73, 0, 0, 1, 4, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 36, 136, 127, 62, 54, 0, 0, 0, 1, 3, 4, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 102, 204, 176, 134, 144, 123, 23, 0, 0, 0, 0, 12, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 155, 236, 207, 178, 107, 156, 161, 109, 64, 23, 77, 130, 72, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 69, 207, 223, 218, 216, 216, 163, 127, 121, 122, 146, 141, 88, 172, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 200, 232, 232, 233, 229, 223, 223, 215, 213, 164, 127, 123, 196, 229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 183, 225, 216, 223, 228, 235, 227, 224, 222, 224, 221, 223, 245, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 193, 228, 218, 213, 198, 180, 212, 210, 211, 213, 223, 220, 243, 202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0, 12, 219, 220, 212, 218, 192, 169, 227, 208, 218, 224, 212, 226, 197, 209, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 99, 244, 222, 220, 218, 203, 198, 221, 215, 213, 222, 220, 245, 119, 167, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 55, 236, 228, 230, 228, 240, 232, 213, 218, 223, 234, 217, 217, 209, 92, 0, 0, 0, 1, 4, 6, 7, 2, 0, 0, 0, 0, 0, 237, 226, 217, 223, 222, 219, 222, 221, 216, 223, 229, 215, 218, 255, 77, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 62, 145, 204, 228, 207, 213, 221, 218, 208, 211, 218, 224, 223, 219, 215, 224, 244, 159, 0, 0, 0, 0, 0, 18, 44, 82, 107, 189, 228, 220, 222, 217, 226, 200, 205, 211, 230, 224, 234, 176, 188, 250, 248, 233, 238, 215, 0, 0, 57, 187, 208, 224, 221, 224, 208, 204, 214, 208, 209, 200, 159, 245, 193, 206, 223, 255, 255, 221, 234, 221, 211, 220, 232, 246, 0, 3, 202, 228, 224, 221, 211, 211, 214, 205, 205, 205, 220, 240, 80, 150, 255, 229, 221, 188, 154, 191, 210, 204, 209, 222, 228, 225, 0, 98, 233, 198, 210, 222, 229, 229, 234, 249, 220, 194, 215, 217, 241, 65, 73, 106, 117, 168, 219, 221, 215, 217, 223, 223, 224, 229, 29, 75, 204, 212, 204, 193, 205, 211, 225, 216, 185, 197, 206, 198, 213, 240, 195, 227, 245, 239, 223, 218, 212, 209, 222, 220, 221, 230, 67, 48, 203, 183, 194, 213, 197, 185, 190, 194, 192, 202, 214, 219, 221, 220, 236, 225, 216, 199, 206, 186, 181, 177, 172, 181, 205, 206, 115, 0, 122, 219, 193, 179, 171, 183, 196, 204, 210, 213, 207, 211, 210, 200, 196, 194, 191, 195, 191, 198, 192, 176, 156, 167, 177, 210, 92, 0, 0, 74, 189, 212, 191, 175, 172, 175, 181, 185, 188, 189, 188, 193, 198, 204, 209, 210, 210, 211, 188, 188, 194, 192, 216, 170, 0, 2, 0, 0, 0, 66, 200, 222, 237, 239, 242, 246, 243, 244, 221, 220, 193, 191, 179, 182, 182, 181, 176, 166, 168, 99, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 61, 44, 72, 41, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]\n"
          ]
        }
      ],
      "execution_count": null
    },
    {
      "cell_type": "code",
      "source": [
        "#这个代码必须是注释了上面的 transforms.ToTensor()才能够运行的\n",
        "def show_single_image(img_arr):\n",
        "    plt.imshow(img_arr, cmap=\"binary\") # 显示图片\n",
        "    plt.colorbar() # 显示颜色条\n",
        "    plt.show()\n",
        "\n",
        "\n",
        "show_single_image(img)"
      ],
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-14T08:19:34.826746Z",
          "start_time": "2025-01-14T08:19:34.771801Z"
        },
        "id": "QL6o7iSagMW0",
        "outputId": "efcacb33-3522-49f3-afeb-b8d2d5bd9da0"
      },
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Figure size 640x480 with 2 Axes>"
            ],
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAAfAAAAGdCAYAAADtxiFiAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAALUJJREFUeJzt3QtsVNed+PHf4eEXYIN52KYYyiMJJDzSJbxCwhJgeVVsIGgVEraCCoFCDSpYCVkqXnlI3tKoiZIloHZTSHZxmqAGUFDllkAwRYE0cRdRkpRgCsUIbAgVNk9j7PnrnHTm7wEDPtfjsY/P9yNdDTNzj+dyPZ7f/M459/xUKBQKCQAAcEqrpj4AAABgjwAOAICDCOAAADiIAA4AgIMI4AAAOIgADgCAgwjgAAA4iAAOAICD2kgzU1NTI6dPn5YOHTqIUqqpDwcAYEmvD3bx4kXp3r27tGrVeHnitWvX5Pr16w3+OQkJCZKUlCSuaXYBXAfv7Ozspj4MAEADlZSUSI8ePRoteCcnJ8fkZ2VmZsrx48edC+LNLoDrzDv8i09NTW3qwwEAWKqoqDCJWPjzvDFcj0HmHVZaWmp+HgH8H9atWyc/+9nPzIkZMmSIvPHGGzJ8+PC7tgt3m+vgTQAHAHfFaxhUNeB1XC4H0iiDE++9957k5ubK6tWr5U9/+pMJ4JMmTZKzZ882xssBADyllGrwZiMvL0+GDRtmehe6desm06dPlyNHjkTtM3bs2Fte45lnnona5+TJk/L9739fUlJSzM957rnn5MaNG00fwH/+85/L/Pnz5Yc//KHcf//9smHDBnOQv/rVrxrj5QAAnlJxDuCFhYWSk5MjBw4ckJ07d0pVVZVMnDhRLl++HLWfjoFnzpyJbGvXro08V11dbYK37rb/5JNP5O2335ZNmzbJqlWrmrYLXR9QUVGRLF++PPKYnoU4YcIE2b9//y37V1ZWmq322AkAAPWhAgThhigoKIi6rwOvzqB13BszZkzkcZ206slxdfn9738vX375pXz00UeSkZEhDz74oLz00kvy/PPPy5o1a8ys+CbJwL/55hvz7UIfVG36vh4Pr6s7Ii0tLbIxAx0AEG8VFRVRW+3E8k7Ky8vNbXp6etTjmzdvli5dusjAgQNNQnvlypXIczqZHTRoUFSc1MPM+nW/+OILdxZy0f8xfQLCm559DgBAPLvQs7Ozo5JJnVzWZ92SJUuWyOjRo02gDnv66aflf//3f+Xjjz82Me5//ud/5N///d8jz+tktq4kN/xck3Wh628crVu3lrKysqjH9f26uhMSExPNBgBAU3Whl9x06XJ94pIeCz98+LDs27cv6vEFCxZE/q0z7aysLBk/frwcO3ZM+vbtK7ES8wxc990PHTpUdu3aFfUtRd8fNWpUrF8OAIAGC1+6HN7uFsAXLVokO3bsMFn23RarGTFihLktLi42tzqZrSvJDT/XpF3o+hKyX/7yl2Zm3VdffSULFy40M/T0rHQAAFydhR4KhUzw3rp1q+zevVt69+591zYHDx40tzoT13Qy++c//znq0mo9o11/cdBXbjXpQi5PPvmknDt3zkyJ1/35eoadnrl3c58/AAAuzULPycmR/Px82b59u7kWPDxmrcfN9dKuuptcPz916lTp3LmzHDp0SJYuXWpmqA8ePNjsqy8704H6Bz/4gbm8TP+MFStWmJ9tM6SsQs1sGRo9C0+fCD2hjZXYAMA98fgcr/jHa+iA19CV2PSM8/oe6+1ea+PGjTJ37lwzlq4nrOmxcd3zrCfHzZgxwwTo2j//b3/7m+md3rNnj7Rr107mzJkj//mf/ylt2tQ/ryaAAwCcDeBJSUkNDuC6MIqLMafZFTMBAKC5dqE3J01+HTgAALBHBg4AcJbyOAMngAMAnKUI4AAAuEd5HMAZAwcAwEFk4AAAZymPM3ACOADAWcrjAE4XOgAADiIDBwA4S3mcgRPAAQDOUh4HcLrQAQBwEBk4AMBZyuMMnAAOAHCaamA1MlfRhQ4AgIPIwAEA3nahK4e73wngAABnKQI4AADuUR4HcMbAAQBwEBk4AMBZyuMMnAAOAHCW8jiA04UOAICDyMABAM5SHmfgBHAAgLOUxwGcLnQAABxEBg7UEmRd5Hh9g7948aJ1m3379gV6rSlTpkhzPd/V1dXWbdq0aXkfdfFcw7s5Z6nK4wy85b2rAQDeUB4HcLrQAQBwEBk4AMBZyuMMnAAOAHCWIoADAOAe5XEAZwwcAAAHkYEDAJylPM7ACeAAAGcpjwM4XegAADiIDBwA4CzlcQZOAAcAOEt5HMDpQgcAwEFk4EAtNTU11m1at25t3aa4uNi6zX//939bt0lOTpYg2rVrZ90mKSnJus3w4cObdWGSIAVDgryHgrxOPM+DbQGZIAVnglIeZ+AEcACA05TDQbgh6EIHAMBBZOAAAGcputABAHCPIoADAOAe5XEAZwwcAAAHkYEDAJylPM7ACeAAAGcpjwM4XegAADiIDBwA4CzlcQZOAAcAOEt5HMDpQgcAwEFk4EADizAEKWaye/du6zY7d+60bpOdnS1BVFZWWre5cuWKdZvf//731m3mz59v3SYjI0PilZ0FeT8EcenSpUDtWrWyz9tSUlKa5TnwPQMngAMAnKU8DuB0oQMA4KCYB/A1a9ZEvhGFt/79+8f6ZQAAkJvjTZDNVY3Shf7AAw/IRx991CSF5wEA/lAed6E3SmTVATszM7MxfjQAABE+B/BGGQM/evSodO/eXfr06SOzZ8+WkydP3nG2a0VFRdQGAADiHMBHjBghmzZtkoKCAlm/fr0cP35cHn30Ubl48WKd++fl5UlaWlpkC3rZCwDAP8rjMfCYB/ApU6bIv/3bv8ngwYNl0qRJ8tvf/lYuXLgg77//fp37L1++XMrLyyNbSUlJrA8JANBCKY8DeKPPLuvYsaPce++9UlxcXOfziYmJZgMAAM3oOnC9WtCxY8ckKyursV8KAOAZFecMXA/7Dhs2TDp06CDdunWT6dOny5EjR6L2uXbtmuTk5Ejnzp2lffv2MnPmTCkrK4vaR88N+/73v29WudM/57nnnpMbN240bQB/9tlnpbCwUE6cOCGffPKJzJgxwyyr99RTT8X6pQAAnlNxDuA6vungfODAAbO8cVVVlUycOFEuX74c2Wfp0qXy4YcfypYtW8z+p0+flieeeCJqyWYdvK9fv27i5Ntvv23mjq1atappu9BPnTplgvX58+ela9eu8sgjj5j/qP43AAAuKygoiLqvA6/OoIuKimTMmDFmLtdbb70l+fn5Mm7cOLPPxo0bZcCAASYWjhw50tQA+PLLL816KXqd/gcffFBeeuklef75581iaAkJCU0TwH/961/H+kcCcVPfP5yG+uyzz6zb6F4tWzU1NdZtgrbTWYit//u//7Nus2zZMus2Dz30kAQxaNAg6zb6g9rWH//4x7i8h7SHH37Yus2oUaOs9o/n5cAqRteB33zM9Z2fpQO2lp6ebm51INdZ+YQJEyL76NVIe/bsKfv37zcBXN/q91btIjt60vfChQvliy++kO9973v1OnbWQgcAOE3FoPtcX8Jc+5JmPdZdny+6S5YskdGjR8vAgQPNY6WlpSYR0BO4a9PBWj8X3ufmCnnh++F96oM1TgEA3ispKZHU1NTI/fpk33os/PDhw7Jv3z5pCgRwAICzVIy60HXwrh3A72bRokWyY8cO2bt3r/To0SPyuF5GXE9O0+uf1M7C9Sz08BLj+vbmYZPwLHWbZcjpQgcAOEvFeRZ6KBQywXvr1q2ye/du6d27d9TzQ4cOlbZt28quXbsij+nLzPRlY+G5BPr2z3/+s5w9ezayj57Rrr9A3H///fU+FjJwAICzVJyLmehucz3DfPv27eZa8PCYtR43T05ONrfz5s2T3NxcM7FNB+XFixeboK0nsIUnfOpA/YMf/EDWrl1rfsaKFSvMz7ZZ2IwADgBAPekaH9rYsWOjHteXis2dO9f8+9VXX5VWrVqZBVx0wS49w/zNN9+M7KvXRtHd73rWuQ7s7dq1kzlz5siLL74oNgjgAABnqThn4LoL/W6SkpJk3bp1ZrudXr16mVohDUEABwA4S1EPHAAAuIQMHADgLOVxBk4ABwA4S3kcwOlCBwDAQWTgaJHqM1M0Vt/G9QIMtj7//HPrNjarRIXVLnFo4+uvv45LG11X2Va/fv2s21y6dEmC0KUebX3wwQfWbdq0sf8oHj58uATxy1/+stGL/AR93wWhPM7ACeAAAGcpjwM4XegAADiIDBwA4CzlcQZOAAcAOEsRwAEAcI/yOIAzBg4AgIPIwAEAzlIeZ+AEcACAs5THAZwudAAAHEQGDgBwlvI4AyeAAwCcpTwO4HShAwDgIDJwAICzlMcZOAEcTlQJa85Wrlxp3ebMmTMSD1euXAnUrnXr1tZtEhMTrdvs27cvLpXcgn5I/9M//ZN1m3vuuScu5/u//uu/JIi//vWv1m1+85vfWO1fUVEh8aQcDsINQRc6AAAOIgMHADhL0YUOAIB7FAEcAAD3KI8DOGPgAAA4iAwcAOAs5XEGTgAHADhLeRzA6UIHAMBBZOAAAGcpjzNwAjgAwFnK4wBOFzoAAA4iAwcAOEt5nIETwBFXLv+x3E6nTp3iUswkOTnZuk1lZaUEUVVVZd3m0qVL1m2SkpKs21y9ejVu77sgxVY++eSTuBT5KSsrkyAmT54sLYnyOIDThQ4AgIPIwAEAzlIeZ+AEcACAsxQBHAAA9yiPAzhj4AAAOIgMHADgLOVxBk4ABwA4S3kcwOlCBwDAQWTgAABnKY8zcAI4AMBZyuMAThc6AAAOIgMHADhLeZyBE8CBBrpy5Yp1m+rqaus2NTU1cSmAomVmZlq36dy5s3WbEydOWLdp1apVXIqFBP09BSm2EuT/1Lp1awni1KlT0pIojwM4XegAADiIDBwA4DTlcBYd1wx87969Mm3aNOnevbs5adu2bbulq2rVqlWSlZVluu8mTJggR48ejeUxAwAQ1YXekM2bAH758mUZMmSIrFu3rs7n165dK6+//rps2LBBPv30U2nXrp1MmjRJrl27FovjBQAgwucAbt2FPmXKFLPVRWffr732mqxYsUIef/xx89g777wjGRkZJlOfNWtWw48YAADEdhLb8ePHpbS01HSbh6WlpcmIESNk//79dbaprKyUioqKqA0AgPpQHmfgMQ3gOnhrOuOuTd8PP3ezvLw8E+TDW3Z2diwPCQDQgikCeNNZvny5lJeXR7aSkpKmPiQAAPy6jCy8+ENZWZmZhR6m7z/44IN1tklMTDQbAAC2FAu5xEbv3r1NEN+1a1fkMT2mrWejjxo1KpYvBQCA+NyFbp2BX7p0SYqLi6Mmrh08eFDS09OlZ8+esmTJEnn55ZflnnvuMQF95cqV5prx6dOnx/rYAQDwlnUA//zzz+Wxxx6L3M/NzTW3c+bMkU2bNsmyZcvMteILFiyQCxcuyCOPPCIFBQWSlJQU2yMHAHhPedyFbh3Ax44de8fCAPpkvPjii2YDYlFUIkgRj6CFHnQPk63Tp09btwky7yMhIcG6zfXr1yWIIMenF22ypSeuxqNoSpCCM0HPX/v27a3bBLl8dtCgQRKETrCCJG6N/XcUlCKAAwDgHuVxAG/yy8gAAIA9MnAAgLMUGTgAAO5RTXAZ2d2qcs6dO/eW15g8eXLUPn//+99l9uzZkpqaKh07dpR58+ZZzx0ggAMAEMOqnJoO2GfOnIls7777btTzOnh/8cUXsnPnTtmxY4f5UqCv3rJBFzoAwFmqCbrQ71SVs/aVHOHVSW/21VdfmcurP/vsM3nooYfMY2+88YZMnTpVXnnlFZPZ1wcZOABAfO9Cr7ipKqaulNkQe/bskW7dusl9990nCxculPPnz0ee09U5dbd5OHhruopnq1atzMql9UUABwB4Lzs7O6oypq6UGZTuPn/nnXfMsuI//elPpbCw0GTs1dXV5nldnVMH99ratGljVjS9XeXOutCFDgAQ37vQS0pKzISysIYU2Zo1a1bUgjuDBw+Wvn37mqx8/PjxEitk4AAA8b0LPTU1NWqLZZXMPn36SJcuXSJ1RPTY+NmzZ6P2uXHjhpmZfrtx87oQwAEAaESnTp0yY+DhMtu6OqeuFVJUVBTZZ/fu3WbZ6BEjRtT759KFDgBwlmqCWeh3qsqptxdeeEFmzpxpsuljx46ZIl/9+vWTSZMmmf0HDBhgxsnnz58vGzZskKqqKlm0aJHpeq/vDHSNDBwA4CzVBAu56OIu3/ve98wWrsqp/71q1SpTSOnQoUPyr//6r3LvvfeaBVqGDh0qf/jDH6K65Tdv3iz9+/c3Y+L68jFdufMXv/iF1XGQgSOugvyxhGduxqMa2XvvvWfdRi/SYKtr167Wba5evRq38xCkYtXJkyet27Rt29a6TZDLe/QM3yB0ZhSP39M333xj3SYnJ0eC0JmiLT0+29h/sw2h4rwc6t2qcv7ud7+768/QmXp+fn6DjoMMHAAAB5GBAwCcpTwuZkIABwA4S3kcwOlCBwDAQWTgAABnKY8zcAI4AMBZyuMAThc6AAAOIgMHADhLeZyBE8ABAM5SHgdwutABAHAQGTgAwFnK4wycAA4AcJYigAPxYVsUQUtISJB4GThwoHWb2hWGGrNIRjyLupw9e9a6TVJSknUbXdAhHu+hIOc7aFGXTp06WbfJzs62bhO0EMZzzz1n3WbkyJFW+1dUVEi8KI8DOGPgAAA4iAwcAOAs5XEGTgAHADhLeRzA6UIHAMBBZOAAAGcpjzNwAjgAwFnK4wBOFzoAAA4iAwcAOEt5nIETwAEAzlIeB3C60AEAcBAZOADAWcrjDJwADgBwliKA+ykUCgVqF6SoRE1NTVyOr23bttZtWrWK30hKmzbN+y03ZcoU6zbt27e3bpOcnGzd5vr16xIvXbt2jUuRkWvXrjXr4jZB3q9B/p6CfKYcOnRIgkhLS5OWRjkchBuCMXAAABzUvNMhAADuQNGFDgCAe5THAZwudAAAHEQGDgBwlvI4AyeAAwCcpTwO4HShAwDgIDJwAICzlMcZOAEcAOAs5XEApwsdAAAHkYEDAJylPM7ACeAAAGcpArj7ghQDaN26dYssyNGc7d2717rNb37zG+s2+/btkyBSUlKs23Tu3Nm6TWVlZVw+aIK+V4OchyB/g0HOQ5ACKEE/pNu1ayfxEKRQTdBj++CDD6zbTJs2TZor5XEAZwwcAAAHkUoCAJylyMDtukB1d0r37t3Nf3zbtm1Rz8+dOzdyQsPb5MmTY3nMAAAYN8ebIJs3Afzy5csyZMgQWbdu3W330QH7zJkzke3dd99t6HECAICGdKFPmTLFbHeSmJgomZmZtj8aAAArii702NqzZ49069ZN7rvvPlm4cKGcP3/+jrNQKyoqojYAAOpD0YUeO7r7/J133pFdu3bJT3/6UyksLDQZ++0uMcnLy5O0tLTIlp2dHetDAgCgxYn5LPRZs2ZF/j1o0CAZPHiw9O3b12Tl48ePv2X/5cuXS25ubuS+zsAJ4gCA+lB0oTeePn36SJcuXaS4uPi24+WpqalRGwAA9aHoQm88p06dMmPgWVlZjf1SAAB4w7oL/dKlS1HZ9PHjx+XgwYOSnp5uthdeeEFmzpxpZqEfO3ZMli1bJv369ZNJkybF+tgBAJ5THnehWwfwzz//XB577LHI/fD49Zw5c2T9+vVy6NAhefvtt+XChQtmsZeJEyfKSy+9ZLrKAQCIJUUAr7+xY8dKKBS67fO/+93vpCkELUwSL3//+9+t25w+fdq6zddffx2X1wlaFCHI8QX58ldTUyNBBCkQcafLJG9Hf7m1lZSUZN2mqqpKgigrK4vL7+nKlSvWbR5++GHrNhcvXpQg/vCHP1i3adXKfmRSX4Fjq23bthLEgQMHpKVRDgfhhqCYCQAADqKYCQDAWYoudAAA3KM8DuB0oQMA4CAycACAs5THGTgBHADgLOVxAKcLHQAAB5GBAwCcpTzOwAngAABnKY8DOF3oAABY2Lt3r0ybNs2sqKi/AGzbti3qeb1a6apVq0wRr+TkZJkwYYIcPXr0ltU5Z8+ebSpwduzYUebNm2dqjdgggAMAnKWaoJzo5cuXZciQIbJu3bo6n1+7dq28/vrrsmHDBvn000/NEs26oNe1a9ci++jg/cUXX8jOnTtlx44d5kvBggULrI6DLnQAgLNUE3ShT5kyxWx10dn3a6+9JitWrJDHH3/cPPbOO+9IRkaGydRnzZolX331lRQUFMhnn30mDz30kNnnjTfekKlTp8orr7xS71oJZOAAAPE9A6+oqIjaKisrAx2PLrFdWlpqus1rF6sZMWKE7N+/39zXt7rbPBy8Nb2/LoSjM3bvMvDwibGhxyiCOHfunHUbXV41HlWNglTh0m+keFWA69ChQ1yqXN2pYt6d6PGqeFTHeu+996zbDBs2zLqN/iAKIkjlsxMnTkg86JLFtmzHFsN69OgRl4p2Qaqy6W7cIOL1e3JNdnZ21P3Vq1fLmjVrrH+ODt6azrhr0/fDz+nbbt26RT3fpk0bSU9Pj+zjVQAHAPhHxagLvaSkxEwoa0jiEG90oQMAxPcu9NTU1KgtaADPzMw0t2VlZVGP6/vh5/Tt2bNno56/ceOGmZke3qc+COAAAMRI7969TRDetWtX1FCWHtseNWqUua9v9bBqUVFRZJ/du3ebIVA9Vl5fdKEDAJylmmAWup5TUVxcHDVx7eDBg2YMu2fPnrJkyRJ5+eWX5Z577jEBfeXKlWZm+fTp083+AwYMkMmTJ8v8+fPNpWZVVVWyaNEiM0O9vjPQNQI4AMBZqgkC+Oeffy6PPfZY5H5ubq65nTNnjmzatEmWLVtmJhnq67p1pv3II4+Yy8ZqTw7dvHmzCdrjx483E5Znzpxprh23QQAHAMDC2LFj73ili/5S8OKLL5rtdnS2np+fLw1BAAcAOEt5vBY6ARwA4CzlcQBnFjoAAA4iAwcAOEt5nIETwAEAzlIEcAAA3KQcDsItMoBXV1ebrb5+/OMfW7/G6dOnJQi96Hw8CpMEKYoQRNCqO0EKfwRpE0R5eXmgdn/729+s2/zHf/xHXM7D+vXrrdtkZWVJvIqZjBs3zrpN3759rdscPXrUus358+cliLZt21q30UtixqMIUZDPIe3mIhpwV7MN4AAA3I2iCx0AAPcojwM4l5EBAOAgMnAAgLOUxxk4ARwA4CzlcQCnCx0AAAeRgQMAnKU8zsAJ4AAAZymPAzhd6AAAOIgMHADgLOVxBk4ABwA4SxHAAQBwjyKANz/5+flWBR+CFKHo06ePBHH58mXrNhcvXoxbAYZ4FF8IWjCkR48e1m2+853vWLe5evWqBJGRkWHdZs6cOdZttm3bZt1m2rRp1m2OHz8u8XqPFxUVWbf5+OOPrdvYFDkKS0xMlHgV+rl+/brEQ9BiJkGOr6SkpNE/79CCAjgAAHejyMABAHCP8jiAcxkZAAAOIgMHADhLeZyBE8ABAM5SHgdwutABAHAQGTgAwFnK4wycAA4AcJbyOIDThQ4AgIPIwAEAzlIeZ+AEcACAsxQBHAAA9ygCePPTtWtXSUlJadQiGUEX3A9SGKFnz55xOb6qqirrNhUVFRJEenq6dZtevXrF5TwkJSVZtwnarnXr1tZtZsyYYd1m0KBB1m1OnDghQQQppBPk76Jjx47Wbdq2bRuX35GWkJAQl2IhrVrZT0cKhULWbYK2+/rrrxu9GA5aUAAHAKClZ9ENQQAHADhLedyFbtVvk5eXJ8OGDZMOHTpIt27dZPr06XLkyJGofa5duyY5OTnSuXNnad++vcycOVPKyspifdwAAHjNKoAXFhaa4HzgwAHZuXOnGW+dOHFi1HjH0qVL5cMPP5QtW7aY/U+fPi1PPPFEYxw7AMBz6h8ZeEM2L7rQCwoKou5v2rTJZOJFRUUyZswYKS8vl7feekvy8/Nl3LhxZp+NGzfKgAEDTNAfOXJkbI8eAOA1RRd6MDpg156NrAO5zsonTJgQ2ad///5mBvb+/fvr/BmVlZVmFnTtDQAANFIAr6mpkSVLlsjo0aNl4MCB5rHS0lJz2cXNl4ZkZGSY5243rp6WlhbZsrOzgx4SAMAzyuMu9MABXI+FHz58WH7961836ACWL19uMvnwVlJS0qCfBwDwh/I4gAe6jGzRokWyY8cO2bt3b9QCKpmZmWYRgwsXLkRl4XoWun7udos/BFkAAgAAn7WyXcFHB++tW7fK7t27pXfv3lHPDx061KyStGvXrshj+jKzkydPyqhRo2J31AAACBm4Vbe5nmG+fft2cy14eFxbj10nJyeb23nz5klubq6Z2JaamiqLFy82wZsZ6ACAWFMez0K3CuDr1683t2PHjo16XF8qNnfuXPPvV1991azrqxdw0TPMJ02aJG+++WYsjxkAAIMAHsNF8HUxiHXr1pmtIbp3725WcmvMYgBBZ7wHWaj/3LlzcSn0oIvAxKONduPGDes2+ktdPF5HrwgYxKVLl6zbVFdXW7fRKxXa+vLLL63b2PwNNbT4TqdOneLyewryfm3TJtiq0UEKpwR5ratXr1q3ud2VPXeje0ptHTx4MC5/f7DDWugAAGcpMnAAANyjPA7gDVqJDQAANA0ycACAs5THGTgBHADgLOVxAKcLHQAAB5GBAwCcpTzOwAngAABnKY8DOF3oAAA4iAwcAOAs5XEGTgAHADhLEcABAHCP8jiAMwYOAICDmm0GPnjwYFNPvL5mzJhh/Rq6DGrQSmm2+vbta91GV3aLRzWt69evSxBBKihVVVXFpRpZkHMX9LWCfINPSUmxbpOVlWXdJkiVPq1169ZxOXdBKu5dvHjRuk1iYqIEEeT4grRJSEiIS6U07fjx49ZtMjIyGv2zoSGUw1l0iwzgAADcjaILHQAAuIQADgBwPgNXDdhsrFmz5pb2/fv3jzx/7do1ycnJkc6dO0v79u1l5syZUlZW1gj/cwI4AMBhKs4BXHvggQfkzJkzkW3fvn2R55YuXSoffvihbNmyRQoLC+X06dPyxBNPSGNgDBwAAAtt2rSRzMzMWx4vLy+Xt956S/Lz82XcuHGRydIDBgyQAwcOyMiRIyWWyMABAOJ7Bl5RURG1VVZW3vY1jx49aq5G6tOnj8yePVtOnjxpHi8qKjJX2kyYMCGyr+5e79mzp+zfvz/m/3cCOABAfA/g2dnZkpaWFtny8vLqfL0RI0bIpk2bpKCgQNavX28uy3v00UfN5Y2lpaXmksCbLyXUl+Hp52KNLnQAgPdKSkqi1h653doBU6ZMiVqvRAf0Xr16yfvvvy/JyckST2TgAADxPQNPTU2N2uq7+I/Otu+9914pLi424+J6YawLFy5E7aNnodc1Zt5QBHAAgLNUE8xCv3n1y2PHjpmVEocOHWpWyNu1a1fk+SNHjpgx8lGjRkms0YUOAHCWivNKbM8++6xMmzbNdJvrS8RWr15tlh5+6qmnzNj5vHnzJDc3V9LT000mv3jxYhO8Yz0DXSOAAwBQT6dOnTLB+vz589K1a1d55JFHzCVi+t/aq6++amoQ6AVc9Ez2SZMmyZtvvimNQYVCoZA0I3r6vv4Wo6+nsylmEsRvf/vbQO1eeeUV6zZnz561bhN+QzR2IYWgBS9qamqs29zp0ozbqa6ujkthDS3In0OQb/9Bji9I0ZmghWqCHF+8PkqCvE63bt0kXoIU7AnyNxh0VrOeeGVLT9Bqbp/jFf94jU8++cSseNaQLvCHH344LjEn1sjAAQDOUhQzAQAALiEDBwA4S3mcgRPAAQDOUh4HcLrQAQBwEBk4AMBZyuMMnAAOAHCW8jiA04UOAICDyMABAM5SHmfgBHAAgLMUARwAAPcojwM4Y+AAADio2WbgulCGTbGMIMUApk6dat0maLvdu3dbt/nJT35i3ebEiRPWbfQi/vEqKhGkMEmQ4hBt2rRp1oUygnzr79Gjh3WbpKQkCSJIcYggv9t4SUhICNQuJSUlLkV+/uVf/sW6zYABAyQIXbijpVEOZ9EtMoADAHA3ii50AADgEjJwAICzlMcZOAEcAOAs5XEApwsdAAAHkYEDAJylPM7ACeAAAGcpjwM4XegAADiIDBwA4CzlcQZOAAcAOEsRwAEAcI/yOIAzBg4AgIOabQaui5MEKVDSXI0bN866zYEDByQe/vKXvwRqd+7cOes2nTp1sm5z6tQp6za9evWSeBW96Nu3b6DXAtBwyuMMvNkGcAAA7kZ5HMBbTooLAIBHrAJ4Xl6eDBs2TDp06GBqIE+fPl2OHDkStc/YsWMj34jC2zPPPBPr4wYAQG6ON0E2LwJ4YWGh5OTkmLHZnTt3SlVVlUycOFEuX74ctd/8+fPlzJkzkW3t2rWxPm4AAMTnAG41Bl5QUBB1f9OmTSYTLyoqkjFjxkQeT0lJkczMzNgdJQAAiN0YeHl5ublNT0+Penzz5s3SpUsXGThwoCxfvlyuXLly259RWVkpFRUVURsAAPWhyMDt1dTUyJIlS2T06NEmUIc9/fTT5hKe7t27y6FDh+T555834+QffPDBbcfVX3jhhaCHAQDwmPJ4FnrgAK7Hwg8fPiz79u2LenzBggWRfw8aNEiysrJk/PjxcuzYsTqvl9UZem5ubuS+zsCzs7ODHhYAAF4IFMAXLVokO3bskL1790qPHj3uuO+IESPMbXFxcZ0BPDEx0WwAANhSZOD1EwqFZPHixbJ161bZs2eP9O7d+65tDh48aG51Jg4AQCwpAnj9u83z8/Nl+/bt5lrw0tJS83haWpokJyebbnL9/NSpU6Vz585mDHzp0qVmhvrgwYMb6/8AAPCUIoDXz/r16yOLtdS2ceNGmTt3rllH+qOPPpLXXnvNXBuux7JnzpwpK1asiO1RAwDgOesu9DvRAVsv9gIAQLwoh7PohqCYCaR///5xbWer9mWKAFCb8rgLnWImAAA4iAwcAOAs5XEGTgAHADhLeRzA6UIHAMBBZOAAAGcpjzNwAjgAwFnK4wBOFzoAAA4iAwcAOEt5nIETwAEAzlIEcAAA3KM8DuCMgQMA4CAycACAs5THGTgBHADgLOVxAKcLHQAAB5GBAwCcpTzOwAngAABnKY8DOF3oAAA4iAwcAOAs5XEGTgAHADhLeRzA6UIHAMBBZOAAAGcpMnAAANwN4KoBWxDr1q2T7373u5KUlCQjRoyQP/7xjxJvBHAAgLNUEwTw9957T3Jzc2X16tXypz/9SYYMGSKTJk2Ss2fPSjwRwAEAsPDzn/9c5s+fLz/84Q/l/vvvlw0bNkhKSor86le/Eq/HwEOhkLmtqKho6kMBAAQQ/vwOf543posXLzZoHFu3ryvmJCYmmu1m169fl6KiIlm+fHnksVatWsmECRNk//794nUAD5/M7Ozspj4UAEADP8/T0tIa5WcnJCRIZmZmTGJF+/btb/k5unt8zZo1t+z7zTffSHV1tWRkZEQ9ru//5S9/Ea8DePfu3aWkpEQ6dOhwy7cq/Q1Jn2T9fGpqqviK8/AtzsO3OA/f4jw0n/OgM28dvPXneWNJSkqS48ePm4w4Fsd7c7ypK/tubppdANddET169LjjPvpN6fMfaBjn4Vuch29xHr7FeWge56GxMu+bg3hSUpLEU5cuXaR169ZSVlYW9bi+r3sE4olJbAAAWHTdDx06VHbt2hV5rKamxtwfNWqUeJ2BAwDQnOXm5sqcOXPkoYcekuHDh8trr70mly9fNrPS48mpAK7HJPTEAhfGJhoT5+FbnIdvcR6+xXn4Fueh8T355JNy7tw5WbVqlZSWlsqDDz4oBQUFt0xsa2wqFI95/gAAIKYYAwcAwEEEcAAAHEQABwDAQQRwAAAc5EwAbw6l25qaXtbv5io6/fv3l5Zu7969Mm3aNLOqk/4/b9u2Lep5PQ9TzwbNysqS5ORksybx0aNHxbfzMHfu3FveH5MnT5aWJC8vT4YNG2ZWauzWrZtMnz5djhw5ErXPtWvXJCcnRzp37myWyJw5c+Yti274cB7Gjh17y/vhmWeeabJjhqcBvLmUbmsOHnjgATlz5kxk27dvn7R0+vpK/TvXX+LqsnbtWnn99ddNRaBPP/1U2rVrZ94f+oPcp/Og6YBd+/3x7rvvSktSWFhogvOBAwdk586dUlVVJRMnTjTnJmzp0qXy4YcfypYtW8z+p0+flieeeEJ8Ow+arphV+/2g/1bQgoQcMHz48FBOTk7kfnV1dah79+6hvLy8kE9Wr14dGjJkSMhn+i27devWyP2amppQZmZm6Gc/+1nksQsXLoQSExND7777bsiX86DNmTMn9Pjjj4d8cvbsWXMuCgsLI7/7tm3bhrZs2RLZ56uvvjL77N+/P+TLedD++Z//OfTjH/+4SY8LjavZZ+Dh0m26W7SpS7c1B7prWHeh9unTR2bPni0nT54Un+liBnohhdrvD70Gsx5m8fH9sWfPHtOlet9998nChQvl/Pnz0pKVl5eb2/T0dHOrPyt0Nlr7/aCHmXr27Nmi3w83n4ewzZs3m7W7Bw4caMpfXrlypYmOEF6uxNacSrc1NR2UNm3aZD6cdXfYCy+8II8++qgcPnzYjIX5SAdvra73R/g5X+juc91V3Lt3bzl27Jj85Cc/kSlTppjApYsvtDR6/eklS5bI6NGjTYDS9O9cr1XdsWNHb94PdZ0H7emnn5ZevXqZL/yHDh2S559/3oyTf/DBB016vPAogOP/0x/GYYMHDzYBXf+Bvv/++zJv3rwmPTY0vVmzZkX+PWjQIPMe6du3r8nKx48fLy2NHgPWX159mAcS5DwsWLAg6v2gJ3nq94H+cqffF3Bfs+9Cb06l25obnWXce++9UlxcLL4Kvwd4f9xKD7Pov5+W+P5YtGiR7NixQz7++OOo8sP6d66H3S5cuODF++F256Eu+gu/1hLfD75q9gG8OZVua24uXbpkvk3rb9a+0t3F+oO59vujoqLCzEb3/f1x6tQpMwbekt4fev6eDlpbt26V3bt3m99/bfqzom3btlHvB91trOeKtKT3w93OQ10OHjxoblvS+8F3TnShN5fSbU3t2WefNdcB625zfWmMvqxO90489dRT0tK/qNTOGvTENf1hpCfs6MlJevzv5Zdflnvuucd8kK1cudKM++lrY305D3rTcyL0Nc/6C43+Yrds2TLp16+fuaSuJXUX5+fny/bt2828j/C4tp64qNcA0Ld6OEl/ZuhzkpqaKosXLzbBe+TIkeLLedC/f/381KlTzfXwegxcX143ZswYM7SCFiLkiDfeeCPUs2fPUEJCgrms7MCBAyHfPPnkk6GsrCxzDr7zne+Y+8XFxaGW7uOPPzaXyNy86cumwpeSrVy5MpSRkWEuHxs/fnzoyJEjIZ/Ow5UrV0ITJ04Mde3a1VxG1atXr9D8+fNDpaWloZakrv+/3jZu3BjZ5+rVq6Ef/ehHoU6dOoVSUlJCM2bMCJ05cybk03k4efJkaMyYMaH09HTzN9GvX7/Qc889FyovL2/qQ0cMUU4UAAAHNfsxcAAAcCsCOAAADiKAAwDgIAI4AAAOIoADAOAgAjgAAA4igAMA4CACOAAADiKAAwDgIAI4AAAOIoADAOAgAjgAAOKe/wc16T7a/BQ6yQAAAABJRU5ErkJggg=="
          },
          "metadata": {},
          "output_type": "display_data"
        }
      ],
      "execution_count": null
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "ExecuteTime": {
          "end_time": "2024-07-17T03:06:34.493969600Z",
          "start_time": "2024-07-17T03:06:33.615812900Z"
        },
        "id": "OllvE6SpgMW0",
        "outputId": "1c98d737-6716-4e83-9a5f-ff57926b0198"
      },
      "outputs": [
        {
          "data": {
            "text/plain": "<Figure size 700x480 with 15 Axes>",
            "image/png": "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fvllJyUlxWq3Y8cO56abbnIKFy7sAPB1KPblhA5u3LjR6d27t1O5cmUnJCTEiYiIcDp16uSsX7/etLmcueMWOjhkyJB077969WonJibGCQ4OzlVhhDkJx8//pIZfp/4XHBzslCtXzrn55pudV1991aSISCW9d65k6tSpTkxMjFO4cGGnaNGiTv369Z3hw4c7v/76q+M4gc2Djz/+2LnllluciIgIJzg42KlcubIzePBg57fffsuah+BjuAYzRpDjBODtQwghhBCSC7ni6teEEEIIITkFNzKEEEII8S3cyBBCCCHEt3AjQwghhBDfwo0MIYQQQnwLNzKEEEII8S3cyBBCCCHEt2So1hLJn8iUQxmttbF9+3YjDx061MipBUdTue6664wsK6AXLGhP2W3bthl5zpw5Rq5WrZrVbvjw4UYuUaLEZfY6/6Irx7/33ntG7tu3r5HLlSt3xffatGmTkVPrkqVy++23Gzk10zZxJzEx0chffvmldW7u3LlGLlWqlJHvueceq931119vZDken3zyidVu2bJlRpa16vr06WO1GzRoUEB9JznHr7/+auTIyMgc7MnlQY0MIYQQQnwLM/sSi4xoXb777jvrWBbV1P96k+XkZan533//3Wp3/PjxgO4tqVmzppFldXLA/hel1B7oKsCPPfaYkevXr3/ZfcgLyHGZMWOGde6VV14xstSUhYeHW+3kOalBkdcG7OJ2P//8s5G7du1qtWvevLmR77jjDq/u5xsWLVpk5AkTJljnZIXk5ORk65yss3T69GkjS+0mABw6dMjIVapUMbLWipYvX97IxYsXN7IuXPjLL78YuV27dkZ+7bXXQGzatGlj5BMnTljnypQpY2RZKFmOkRdS6wIArVu3NrJ8D1euXNlqt2TJEiNLzVtugBoZQgghhPgWbmQIIYQQ4lu4kSGEEEKIb6GPDAkYaU+XESubN2+22skpVaRIEeuctN1LW7v0nQGACxcuGPnUqVNGvvrqq6128nOB+vT88ccfRta+OdKfoEWLFta5Dz/8MKDr5yVmz55tHcvxe/75542s7e7Sv0L6SuiIsaJFixpZ+k3cddddVjvpW6P9Z/ITe/bsMfKoUaOMHBERYbWT8zolJcU6J/3H5BqUPkoaubb0Wi1WrJiRpT+U9qUpXbq0kaW/jJ4T48aNc+1HfqFVq1ZGlmMO2OtJjrN+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EBwcjISEBPP3Dz/8EDExMShcuDBKlSqFO++8Ez///LP12VatWqFevXrYsGEDbrrpJlx99dV48sknL3lPv8I16E8CXZfTpk1DmzZtEBERgZCQENSpUweTJk1K85kqVaqgU6dOWLlyJZo0aYLQ0FBUq1YNH3zwQZq227ZtQ5s2bVC4cGFUrFgRzz33HFJSUtK0mzt3Ljp27IjIyEiEhIQgOjoazz77rDWe+RmOYeaRoxuZPXv2AABKly6d6dceNWoUhgwZgsjISIwbNw633347pkyZgltuuQV//vknAKBXr144e/Ys/ve//1mfPXfuHObPn48ePXqgQIECAIDp06ejY8eOKFKkCMaMGYOnnnoKP/zwA1q0aJHGOerChQuIi4tDREQExo4di9tvvz3Tv192ERUVhQ0bNuD777+/ZNuVK1fioYcewp133omXXnoJf/zxB26//XYcO3bMtDl06BCaNWuGZcuWYejQoXj11VdRvXp13HfffXjllVdMu9OnT+Ptt99Gq1atMGbMGIwaNQpHjhxBXFwcNm3a5NqHixcvon///vjggw8wZ84cdO/eHcBf//rp27cvatSogfHjx2PYsGH4/PPPcdNNN1k/rABw7NgxtG/fHg0bNsQrr7yC1q1bX9Yz8xNcg/4k0HU5adIkREVF4cknn8S4ceNQqVIlPPTQQ3jzzTfTtN29ezd69OiBm2++GePGjUPJkiXRv39/a6N48OBBtG7dGps2bcKIESMwbNgwfPDBB3j11VfTXO+9995DkSJF8Pe//x2vvvoqYmJi8PTTT2PEiBFX/gDyABzDTMTJBqZNm+YAcJYtW+YcOXLE+fnnn50ZM2Y4pUuXdgoXLuz88ssvTmxsrBMbG5vms/369XOioqKsvwFwRo4cmeb6iYmJjuM4zuHDh53g4GDnlltucS5evGjavfHGGw4A591333Ucx3FSUlKcChUqOLfffrt1/VmzZjkAnK+++spxHMdJSkpySpQo4QwcONBqd/DgQad48eLW3/v16+cAcEaMGHG5jylX8tlnnzkFChRwChQo4DRv3twZPny4s2TJEic5OdlqB8AJDg52du/ebf62efNmB4Dz+uuvm7/dd999Tvny5Z2jR49an7/zzjud4sWLO+fOnXMcx3EuXLjgnD9/3mpz4sQJp2zZss6AAQPM3xITEx0Azssvv+z8+eefTq9e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eDhatWqFM2fOuLY7f/48Ro4cierVqyMkJASVKlXC8OHDcf78+YC/z4YNG3DDDTeY+TB58uQ0bQ4fPoz77rsPZcuWRWhoKK699lq8//77adqdPXsWjz32GCpVqoSQkBBcc801GDt2LBzHMW2CgoJw9uxZvP/++2Yu9O/fP+D+5hR79uxB3bp107xYASAiIsLI06ZNQ5s2bRAREYGQkBDUqVMHkyZNSvOZKlWqoFOnTli5ciWaNGmC0NBQVKtWDR988EGattu2bUObNm1QuHBhVKxYEc899xxSUlLStJs7dy46duyIyMhIhISEIDo6Gs8++ywuXrx4ZV8+D8Dx8w+BjlXq782nn36KevXqISQkBHXr1sXixYvTfO7AgQMYMGAAypYta9q9++67Vpvk5GQ8/fTTiImJQfHixREWFoaWLVtixYoVl+yz4zgYNGgQgoODkZCQYP7+4YcfIiYmBoULF0apUqVw55134ueff7Y+m+qvuGHDBtx00024+uqr8eSTT17ynldCjmpkroTDhw/jlltuQXh4OEaMGIESJUpg37591kNP5aOPPkJSUhIGDx6MoKAgvPTSS+jevTv27t2LQoUKed5n+fLlmDVrFoYOHYoyZcrg2muvxaRJk/Dggw+iW7du6N69OwCgQYMGWfI9s5r4+Hh0794dwcHB6N27NyZNmoR169ahcePGadpm5DmuW7cOcXFxaNSoEebOnYvChQun2y4lJQVdunTBypUrMWjQINSuXRtbt27FhAkTsHPnzoB8UE6cOIEOHTqgZ8+e6N27N2bNmoUHH3wQwcHBZoP7+++/o1WrVti9ezeGDh2KqlWrYvbs2ejfvz9OnjyJRx99FMBfC7lLly5YsWIF7rvvPjRs2BBLlizB448/jgMHDmDChAkA/jKP3n///WjSpAkGDRoEAIiOjr5kX3OaqKgorFmzBt9//72nk/SkSZNQt25ddOnSBQULFsT8+fPx0EMPISUlBUOGDLHa7t69Gz169MB9992Hfv364d1330X//v0RExODunXrAgAOHjyI1q1b48KFCxgxYgTCwsIwderUdOfFe++9hyJFiuDvf/87ihQpguXLl+Ppp5/G6dOn8fLLL2fuA/EZHD//EOhYAcDKlSuRkJCAhx56CEWLFsVrr72G22+/HT/99BNKly4NADh06BCaNWtmNj7h4eFYtGgR7rvv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"
          },
          "metadata": {},
          "output_type": "display_data"
        }
      ],
      "source": [
        "def show_imgs(n_rows, n_cols, train_ds, class_names):\n",
        "    assert n_rows * n_cols < len(train_ds)  #确保打印的图片小于总样本数\n",
        "    plt.figure(figsize = (n_cols * 1.4, n_rows * 1.6))  #宽1.4高1.6，宽，高\n",
        "    for row in range(n_rows):\n",
        "        for col in range(n_cols):\n",
        "            index = n_cols * row + col  # 计算索引，从0开始\n",
        "            plt.subplot(n_rows, n_cols, index+1)#因为从1开始\n",
        "            img_arr, label = train_ds[index]\n",
        "            img_arr = np.transpose(img_arr, (1, 2, 0))  # 通道换到最后一维\n",
        "            plt.imshow(img_arr, cmap=\"binary\",\n",
        "                       interpolation = 'nearest')#interpolation='nearest'是临近插值\n",
        "            plt.axis('off')#去除坐标系\n",
        "            plt.title(class_names[label]) # 显示类别名称\n",
        "    plt.show()\n",
        "\n",
        "\n",
        "\n",
        "#已知的图片类别\n",
        "# lables在这个路径https://github.com/zalandoresearch/fashion-mnist\n",
        "class_names = ['T-shirt', 'Trouser', 'Pullover', 'Dress',\n",
        "               'Coat', 'Sandal', 'Shirt', 'Sneaker',\n",
        "               'Bag', 'Ankle boot'] #0-9分别代表的类别\n",
        "#只是打印了前15个样本\n",
        "show_imgs(3, 5, train_ds, class_names)\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 7,
      "metadata": {
        "ExecuteTime": {
          "end_time": "2024-07-17T03:06:34.502676900Z",
          "start_time": "2024-07-17T03:06:34.495968400Z"
        },
        "id": "6zb58GXSgMW1"
      },
      "outputs": [],
      "source": [
        "# 从数据集到dataloader\n",
        "train_loader = torch.utils.data.DataLoader(train_ds, batch_size=32, shuffle=True) #batch_size分批，shuffle洗牌\n",
        "val_loader = torch.utils.data.DataLoader(test_ds, batch_size=32, shuffle=False)"
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "在PyTorch中，`DataLoader`是一个迭代器，它封装了数据的加载和预处理过程，使得在训练机器学习模型时可以方便地批量加载数据。`DataLoader`主要负责以下几个方面：\n",
        "\n",
        "1. **批量加载数据**：`DataLoader`可以将数据集（Dataset）切分为更小的批次（batch），每次迭代提供一小批量数据，而不是单个数据点。这有助于模型学习数据中的统计依赖性，并且可以更高效地利用GPU等硬件的并行计算能力。\n",
        "\n",
        "2. **数据打乱**：默认情况下，`DataLoader`会在每个epoch（训练周期）开始时打乱数据的顺序。这有助于模型训练时避免陷入局部最优解，并且可以提高模型的泛化能力。\n",
        "\n",
        "3. **多线程数据加载**：`DataLoader`支持多线程（通过参数`num_workers`）来并行地加载数据，这可以显著减少训练过程中的等待时间，尤其是在处理大规模数据集时。\n",
        "\n",
        "4. **数据预处理**：`DataLoader`可以与`transforms`结合使用，对加载的数据进行预处理，如归一化、标准化、数据增强等操作。\n",
        "\n",
        "5. **内存管理**：`DataLoader`负责管理数据的内存使用，确保在训练过程中不会耗尽内存资源。\n",
        "\n",
        "6. **易用性**：`DataLoader`提供了一个简单的接口，可以很容易地集成到训练循环中。\n",
        "\n"
      ],
      "metadata": {
        "collapsed": false,
        "id": "lPM2diL2gMW1"
      }
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "x0t8HBKigMW1"
      },
      "source": [
        "## 定义模型"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 8,
      "metadata": {
        "ExecuteTime": {
          "end_time": "2024-07-17T03:06:34.555159500Z",
          "start_time": "2024-07-17T03:06:34.506683500Z"
        },
        "id": "PyRPrX1SgMW1"
      },
      "outputs": [],
      "source": [
        "class NeuralNetwork(nn.Module):\n",
        "    def __init__(self):\n",
        "        super().__init__() # 继承父类的初始化方法，子类有父类的属性\n",
        "        self.flatten = nn.Flatten()  # 展平层\n",
        "        self.linear_relu_stack = nn.Sequential(\n",
        "            nn.Linear(784, 300),  # in_features=784, out_features=300, 784是输入特征数，300是输出特征数\n",
        "            nn.ReLU(), # 激活函数\n",
        "            nn.Linear(300, 100),#隐藏层神经元数100\n",
        "            nn.ReLU(), # 激活函数\n",
        "            nn.Linear(100, 10),#输出层神经元数10\n",
        "        )\n",
        "\n",
        "    def forward(self, x): # 前向计算\n",
        "        # x.shape [batch size, 1, 28, 28]\n",
        "        x = self.flatten(x)\n",
        "        # 展平后 x.shape [batch size, 784]\n",
        "        logits = self.linear_relu_stack(x)\n",
        "        # logits.shape [batch size, 10]\n",
        "        return logits #没有经过softmax,称为logits\n",
        "\n",
        "model = NeuralNetwork()"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 9,
      "metadata": {
        "ExecuteTime": {
          "end_time": "2024-07-17T03:06:34.557156400Z",
          "start_time": "2024-07-17T03:06:34.531072900Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "C_dLEQApgMW1",
        "outputId": "ea0d2ce9-cb45-42cb-9e49-89eecca8eddf"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "NeuralNetwork(\n",
              "  (flatten): Flatten(start_dim=1, end_dim=-1)\n",
              "  (linear_relu_stack): Sequential(\n",
              "    (0): Linear(in_features=784, out_features=300, bias=True)\n",
              "    (1): ReLU()\n",
              "    (2): Linear(in_features=300, out_features=100, bias=True)\n",
              "    (3): ReLU()\n",
              "    (4): Linear(in_features=100, out_features=10, bias=True)\n",
              "  )\n",
              ")"
            ]
          },
          "metadata": {},
          "execution_count": 9
        }
      ],
      "source": [
        "# 看看网络结构\n",
        "model"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 10,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "266610"
            ]
          },
          "metadata": {},
          "execution_count": 10
        }
      ],
      "source": [
        "784*300+300+300*100+100+100*10+10"
      ],
      "metadata": {
        "ExecuteTime": {
          "end_time": "2024-07-17T03:06:34.557156400Z",
          "start_time": "2024-07-17T03:06:34.537519200Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "1jlaxEfhgMW1",
        "outputId": "50ede1a9-a972-4a8d-9248-8f8026bb2c73"
      }
    },
    {
      "cell_type": "code",
      "execution_count": 11,
      "metadata": {
        "ExecuteTime": {
          "end_time": "2024-07-17T03:06:34.563404800Z",
          "start_time": "2024-07-17T03:06:34.552159400Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "vZnx2q8FgMW1",
        "outputId": "70300879-1b95-4d2d-8744-a599cdfa8474"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "linear_relu_stack.0.weight torch.Size([300, 784])\n",
            "linear_relu_stack.0.bias torch.Size([300])\n",
            "linear_relu_stack.2.weight torch.Size([100, 300])\n",
            "linear_relu_stack.2.bias torch.Size([100])\n",
            "linear_relu_stack.4.weight torch.Size([10, 100])\n",
            "linear_relu_stack.4.bias torch.Size([10])\n"
          ]
        }
      ],
      "source": [
        "for name, param in model.named_parameters(): # 打印模型参数\n",
        "      print(name, param.shape)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 12,
      "metadata": {
        "ExecuteTime": {
          "end_time": "2024-07-17T03:06:34.676506700Z",
          "start_time": "2024-07-17T03:06:34.563404800Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "cPjDRXTugMW1",
        "outputId": "88d98251-d892-45f7-b048-1e9832fc8e2a"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "[Parameter containing:\n",
              " tensor([[-0.0333, -0.0186, -0.0229,  ...,  0.0325, -0.0267, -0.0297],\n",
              "         [-0.0207,  0.0054,  0.0218,  ...,  0.0003,  0.0170,  0.0186],\n",
              "         [-0.0242, -0.0109,  0.0183,  ..., -0.0270,  0.0288,  0.0061],\n",
              "         ...,\n",
              "         [ 0.0041,  0.0181,  0.0069,  ...,  0.0214,  0.0176,  0.0133],\n",
              "         [-0.0222,  0.0168, -0.0041,  ...,  0.0096,  0.0326,  0.0031],\n",
              "         [-0.0071, -0.0109, -0.0176,  ..., -0.0146,  0.0177, -0.0003]],\n",
              "        requires_grad=True),\n",
              " Parameter containing:\n",
              " tensor([ 0.0137,  0.0211,  0.0235,  0.0237, -0.0091, -0.0243, -0.0215,  0.0194,\n",
              "         -0.0230,  0.0012, -0.0275, -0.0103,  0.0198, -0.0193, -0.0246, -0.0236,\n",
              "          0.0047,  0.0117,  0.0189,  0.0325, -0.0214,  0.0159, -0.0034,  0.0342,\n",
              "          0.0057, -0.0248,  0.0334,  0.0271, -0.0350, -0.0037, -0.0126,  0.0311,\n",
              "          0.0174, -0.0193, -0.0057, -0.0241, -0.0180, -0.0279,  0.0240,  0.0165,\n",
              "          0.0046, -0.0273,  0.0269,  0.0270, -0.0126,  0.0297,  0.0290, -0.0351,\n",
              "          0.0300, -0.0158,  0.0167, -0.0201, -0.0348,  0.0130,  0.0209,  0.0173,\n",
              "         -0.0273, -0.0293, -0.0207,  0.0138,  0.0257, -0.0326,  0.0319,  0.0265,\n",
              "         -0.0213, -0.0121,  0.0115,  0.0046, -0.0247,  0.0076,  0.0307, -0.0015,\n",
              "         -0.0017,  0.0152, -0.0288, -0.0174, -0.0054, -0.0037, -0.0244,  0.0080,\n",
              "          0.0194, -0.0354, -0.0152,  0.0221, -0.0128, -0.0201, -0.0251, -0.0021,\n",
              "          0.0005,  0.0286, -0.0193,  0.0135, -0.0130, -0.0351,  0.0260,  0.0295,\n",
              "         -0.0178,  0.0043, -0.0304,  0.0281,  0.0145, -0.0306, -0.0058,  0.0043,\n",
              "          0.0271, -0.0251,  0.0262, -0.0013, -0.0013, -0.0063,  0.0352,  0.0116,\n",
              "         -0.0131,  0.0282, -0.0040,  0.0338, -0.0071, -0.0236, -0.0237, -0.0102,\n",
              "          0.0088,  0.0142, -0.0074, -0.0019, -0.0129,  0.0184, -0.0260,  0.0234,\n",
              "          0.0218,  0.0065,  0.0214, -0.0321,  0.0129, -0.0287,  0.0223,  0.0295,\n",
              "         -0.0116,  0.0150, -0.0114, -0.0277,  0.0082,  0.0115,  0.0327,  0.0168,\n",
              "         -0.0059,  0.0080,  0.0246, -0.0041, -0.0251,  0.0235, -0.0310, -0.0351,\n",
              "          0.0224,  0.0237,  0.0195,  0.0199, -0.0295,  0.0134, -0.0031, -0.0302,\n",
              "          0.0145, -0.0254, -0.0251, -0.0235,  0.0322,  0.0346, -0.0245,  0.0160,\n",
              "         -0.0182,  0.0278,  0.0249, -0.0169,  0.0261,  0.0292, -0.0021, -0.0298,\n",
              "          0.0125, -0.0149, -0.0237,  0.0298, -0.0234,  0.0004, -0.0225,  0.0093,\n",
              "          0.0295, -0.0096, -0.0141,  0.0220, -0.0289,  0.0081,  0.0214, -0.0157,\n",
              "         -0.0128,  0.0154,  0.0130,  0.0355, -0.0295,  0.0210,  0.0011,  0.0336,\n",
              "         -0.0357,  0.0324,  0.0077,  0.0324,  0.0353,  0.0281,  0.0200, -0.0041,\n",
              "          0.0112, -0.0077, -0.0156,  0.0102,  0.0093, -0.0313, -0.0306, -0.0109,\n",
              "          0.0164, -0.0127, -0.0083, -0.0098, -0.0233,  0.0268, -0.0325,  0.0332,\n",
              "         -0.0200,  0.0312, -0.0151,  0.0343,  0.0287,  0.0278,  0.0302,  0.0047,\n",
              "         -0.0232, -0.0008, -0.0027, -0.0116,  0.0254,  0.0168, -0.0255,  0.0250,\n",
              "          0.0343, -0.0067, -0.0141,  0.0272,  0.0154, -0.0051, -0.0247,  0.0223,\n",
              "         -0.0093, -0.0308,  0.0144, -0.0298, -0.0338,  0.0284,  0.0354,  0.0138,\n",
              "         -0.0292,  0.0209,  0.0280,  0.0328,  0.0276, -0.0171,  0.0042, -0.0303,\n",
              "         -0.0057,  0.0336, -0.0013, -0.0109,  0.0283,  0.0313, -0.0265,  0.0111,\n",
              "          0.0165, -0.0077,  0.0204,  0.0234,  0.0222,  0.0200,  0.0122,  0.0084,\n",
              "          0.0015,  0.0222, -0.0355,  0.0218,  0.0165,  0.0025,  0.0187,  0.0088,\n",
              "         -0.0010, -0.0289,  0.0237,  0.0329, -0.0263,  0.0260,  0.0307,  0.0224,\n",
              "          0.0227,  0.0255, -0.0132, -0.0116], requires_grad=True),\n",
              " Parameter containing:\n",
              " tensor([[ 0.0035, -0.0205,  0.0106,  ...,  0.0432, -0.0201, -0.0025],\n",
              "         [ 0.0491, -0.0034, -0.0233,  ...,  0.0427,  0.0473, -0.0395],\n",
              "         [ 0.0498,  0.0435, -0.0291,  ..., -0.0537, -0.0111,  0.0079],\n",
              "         ...,\n",
              "         [-0.0254,  0.0332,  0.0344,  ..., -0.0062,  0.0257, -0.0576],\n",
              "         [-0.0501, -0.0063,  0.0058,  ..., -0.0495, -0.0440, -0.0558],\n",
              "         [ 0.0200, -0.0427, -0.0029,  ..., -0.0404,  0.0540,  0.0319]],\n",
              "        requires_grad=True),\n",
              " Parameter containing:\n",
              " tensor([-0.0299, -0.0469,  0.0059,  0.0556,  0.0510,  0.0483, -0.0432,  0.0437,\n",
              "         -0.0491, -0.0382, -0.0277, -0.0268, -0.0114,  0.0341, -0.0339, -0.0111,\n",
              "          0.0488,  0.0565,  0.0206, -0.0295,  0.0211,  0.0272, -0.0090,  0.0494,\n",
              "         -0.0384, -0.0203, -0.0021, -0.0053, -0.0074, -0.0550, -0.0397,  0.0378,\n",
              "          0.0380,  0.0185,  0.0287, -0.0392, -0.0492,  0.0417,  0.0442, -0.0139,\n",
              "          0.0100, -0.0126, -0.0456,  0.0276, -0.0229,  0.0124, -0.0180, -0.0533,\n",
              "          0.0107, -0.0315, -0.0094, -0.0300, -0.0345,  0.0446,  0.0251,  0.0479,\n",
              "          0.0111,  0.0025, -0.0034, -0.0050, -0.0491,  0.0224, -0.0154,  0.0546,\n",
              "         -0.0089,  0.0031,  0.0396,  0.0069, -0.0468,  0.0168,  0.0062, -0.0270,\n",
              "          0.0138, -0.0089,  0.0423, -0.0407,  0.0258,  0.0180, -0.0242,  0.0420,\n",
              "          0.0152,  0.0121, -0.0050, -0.0030, -0.0199, -0.0241, -0.0145,  0.0085,\n",
              "          0.0072, -0.0216,  0.0365,  0.0242, -0.0499,  0.0223,  0.0307,  0.0272,\n",
              "          0.0348,  0.0128,  0.0362,  0.0340], requires_grad=True),\n",
              " Parameter containing:\n",
              " tensor([[-0.0528, -0.0562, -0.0906, -0.0958, -0.0768,  0.0089,  0.0256,  0.0897,\n",
              "          -0.0151,  0.0836, -0.0222,  0.0452, -0.0208, -0.0109, -0.0461,  0.0013,\n",
              "          -0.0293,  0.0198,  0.0349, -0.0971, -0.0676, -0.0059, -0.0884,  0.0899,\n",
              "           0.0462,  0.0509,  0.0287, -0.0325,  0.0911,  0.0369,  0.0299, -0.0897,\n",
              "          -0.0479,  0.0559, -0.0664, -0.0862, -0.0486,  0.0507,  0.0349, -0.0742,\n",
              "           0.0848, -0.0045, -0.0214, -0.0380, -0.0498, -0.0604, -0.0101, -0.0558,\n",
              "           0.0486,  0.0353, -0.0672,  0.0726, -0.0603, -0.0432, -0.0034,  0.0297,\n",
              "           0.0200, -0.0774,  0.0952, -0.0557,  0.0149, -0.0712,  0.0118, -0.0570,\n",
              "           0.0478,  0.0484, -0.0607,  0.0407, -0.0788,  0.0597, -0.0107,  0.0523,\n",
              "          -0.0393, -0.0969, -0.0055,  0.0166, -0.0875, -0.0775, -0.0273, -0.0568,\n",
              "           0.0888,  0.0183, -0.0367, -0.0237,  0.0421,  0.0931, -0.0832, -0.0305,\n",
              "           0.0451,  0.0381,  0.0946,  0.0165, -0.0901, -0.0476, -0.0628,  0.0438,\n",
              "          -0.0948, -0.0869,  0.0431, -0.0850],\n",
              "         [ 0.0444, -0.0389, -0.0616,  0.0173, -0.0959, -0.0001,  0.0646, -0.0981,\n",
              "           0.0050,  0.0465, -0.0063, -0.0176,  0.0354, -0.0057, -0.0447, -0.0753,\n",
              "           0.0242, -0.0051,  0.0436, -0.0988,  0.0034, -0.0642,  0.0015, -0.0079,\n",
              "           0.0244, -0.0483,  0.0804,  0.0507, -0.0099,  0.0867, -0.0128,  0.0229,\n",
              "          -0.0871,  0.0620, -0.0746, -0.0454,  0.0472,  0.0289, -0.0725, -0.0479,\n",
              "          -0.0656, -0.0416,  0.0337,  0.0687, -0.0692,  0.0977,  0.0383,  0.0237,\n",
              "           0.0370, -0.0325,  0.0856,  0.0920, -0.0840,  0.0791, -0.0658, -0.0403,\n",
              "           0.0602, -0.0405, -0.0243, -0.0409, -0.0750, -0.0592,  0.0459,  0.0932,\n",
              "          -0.0968, -0.0501, -0.0468,  0.0083, -0.0869,  0.0714,  0.0792,  0.0202,\n",
              "          -0.0394,  0.0198,  0.0322, -0.0272, -0.0108,  0.0338, -0.0217, -0.0316,\n",
              "           0.0040,  0.0867, -0.0634, -0.0710, -0.0934, -0.0945,  0.0896,  0.0721,\n",
              "          -0.0755,  0.0903, -0.0884,  0.0731, -0.0701,  0.0017,  0.0057,  0.0658,\n",
              "           0.0367,  0.0269,  0.0056, -0.0071],\n",
              "         [-0.0166,  0.0802,  0.0256, -0.0643, -0.0652, -0.0677,  0.0168,  0.0782,\n",
              "           0.0211,  0.0531, -0.0678,  0.0573, -0.0797,  0.0141, -0.0193, -0.0214,\n",
              "           0.0458, -0.0294,  0.0277,  0.0449, -0.0704,  0.0519, -0.0690,  0.0218,\n",
              "          -0.0437,  0.0681,  0.0452,  0.0851, -0.0303, -0.0066, -0.0421, -0.0498,\n",
              "          -0.0063, -0.0518,  0.0960, -0.0231,  0.0015,  0.0184, -0.0809,  0.0429,\n",
              "          -0.0910, -0.0430, -0.0529,  0.0698,  0.0717, -0.0432, -0.0999,  0.0603,\n",
              "           0.0762,  0.0893, -0.0992,  0.0217,  0.0385, -0.0144, -0.0327, -0.0966,\n",
              "          -0.0920, -0.0809, -0.0239, -0.0032,  0.0391, -0.0520, -0.0572,  0.0719,\n",
              "          -0.0928,  0.0258, -0.0348,  0.0250, -0.0291, -0.0487, -0.0470, -0.0684,\n",
              "          -0.0059, -0.0322, -0.0202, -0.0749,  0.0956, -0.0900, -0.0915,  0.0344,\n",
              "          -0.0938,  0.0980,  0.0215, -0.0402, -0.0715, -0.0347,  0.0857,  0.0514,\n",
              "          -0.0156,  0.0274, -0.0592,  0.0064, -0.0295,  0.0607,  0.0076, -0.0090,\n",
              "          -0.0950, -0.0459, -0.0881,  0.0974],\n",
              "         [ 0.0103, -0.0122,  0.0012,  0.0855, -0.0911,  0.0963,  0.0799, -0.0971,\n",
              "          -0.0741, -0.0720,  0.0938, -0.0405,  0.0810, -0.0310,  0.0845,  0.0239,\n",
              "          -0.0991, -0.0291, -0.0611, -0.0799,  0.0684,  0.0756,  0.0630,  0.0627,\n",
              "          -0.0824, -0.0193, -0.0695,  0.0549,  0.0949,  0.0947, -0.0903, -0.0654,\n",
              "           0.0789,  0.0568,  0.0399,  0.0202, -0.0680, -0.0527,  0.0864, -0.0882,\n",
              "           0.0591,  0.0533,  0.0866,  0.0427,  0.0621,  0.0686,  0.0713, -0.0287,\n",
              "           0.0835,  0.0501,  0.0757, -0.0907,  0.0206, -0.0255, -0.0817, -0.0110,\n",
              "           0.0137, -0.0458, -0.0687,  0.0562, -0.0957,  0.0648, -0.0879,  0.0121,\n",
              "           0.0456,  0.0406,  0.0353,  0.0472,  0.0385, -0.0481, -0.0168, -0.0780,\n",
              "           0.0759,  0.0061, -0.0264,  0.0178, -0.0817,  0.0398, -0.0991, -0.0766,\n",
              "          -0.0017,  0.0959, -0.0540,  0.0510, -0.0439, -0.0634, -0.0089,  0.0357,\n",
              "           0.0391,  0.0787,  0.0820,  0.0701,  0.0781, -0.0011, -0.0146, -0.0473,\n",
              "          -0.0544, -0.0208,  0.0636, -0.0911],\n",
              "         [ 0.0975, -0.0357, -0.0838, -0.0700,  0.0840, -0.0589,  0.0455, -0.0667,\n",
              "           0.0861, -0.0669,  0.0335, -0.0592, -0.0927,  0.0374,  0.0014, -0.0355,\n",
              "           0.0085, -0.0425, -0.0913, -0.0534,  0.0648, -0.0930, -0.0363,  0.0660,\n",
              "           0.0909, -0.0831, -0.0024,  0.0756, -0.0543,  0.0366, -0.0431, -0.0061,\n",
              "           0.0792,  0.0342,  0.0473, -0.0654, -0.0670,  0.0185, -0.0543, -0.0769,\n",
              "          -0.0545,  0.0957,  0.0715,  0.0801,  0.0489,  0.0586,  0.0787,  0.0728,\n",
              "          -0.0919,  0.0505,  0.0330, -0.0739,  0.0812, -0.0600,  0.0911,  0.0993,\n",
              "           0.0936,  0.0593, -0.0645,  0.0163, -0.0014,  0.0224,  0.0254, -0.0988,\n",
              "          -0.0009,  0.0797,  0.0580, -0.0936,  0.0215,  0.0181,  0.0393,  0.0912,\n",
              "           0.0982, -0.0711,  0.0129, -0.0907, -0.0304,  0.0476, -0.0641, -0.0970,\n",
              "          -0.0491, -0.0474,  0.0040, -0.0232, -0.0472, -0.0668,  0.0223,  0.0681,\n",
              "           0.0145, -0.0414,  0.0723,  0.0432,  0.0813, -0.0168, -0.0188,  0.0595,\n",
              "           0.0368,  0.0658, -0.0428,  0.0486],\n",
              "         [ 0.0456, -0.0368,  0.0066,  0.0032, -0.0920,  0.0714,  0.0067,  0.0495,\n",
              "           0.0177,  0.0896,  0.0210,  0.0935, -0.0141,  0.0082, -0.0862,  0.0824,\n",
              "          -0.0609,  0.0010,  0.0205, -0.0946,  0.0793,  0.0832, -0.0706,  0.0771,\n",
              "           0.0007,  0.0179, -0.0314, -0.0987,  0.0061, -0.0432, -0.0751, -0.0218,\n",
              "          -0.0922,  0.0713, -0.0191,  0.0266,  0.0283,  0.0842, -0.0450, -0.0531,\n",
              "           0.0723,  0.0859,  0.0989,  0.0703,  0.0232,  0.0333, -0.0305,  0.0755,\n",
              "           0.0907, -0.0025, -0.0112, -0.0151, -0.0519, -0.0396,  0.0535, -0.0960,\n",
              "          -0.0412,  0.0387,  0.0352, -0.0230,  0.0580,  0.0823, -0.0496, -0.0794,\n",
              "           0.0128,  0.0512,  0.0553, -0.0962,  0.0532,  0.0263, -0.0259, -0.0429,\n",
              "          -0.0678,  0.0327, -0.0038, -0.0318,  0.0927,  0.0144,  0.0488, -0.0081,\n",
              "           0.0801, -0.0149,  0.0642, -0.0835,  0.0818, -0.0989,  0.0361,  0.0833,\n",
              "          -0.0152,  0.0777, -0.0376,  0.0974, -0.0590, -0.0772, -0.0582, -0.0197,\n",
              "           0.0497, -0.0703,  0.0375,  0.0052],\n",
              "         [ 0.0592,  0.0406, -0.0007,  0.0809, -0.0871,  0.0485, -0.0928,  0.0610,\n",
              "           0.0920,  0.0999, -0.0763,  0.0671, -0.0973, -0.0499,  0.0780, -0.0248,\n",
              "          -0.0495,  0.0688,  0.0513, -0.0920,  0.0557, -0.0501,  0.0066,  0.0119,\n",
              "           0.0754,  0.0798, -0.0184,  0.0032,  0.0055,  0.0224,  0.0662,  0.0460,\n",
              "          -0.0956,  0.0038,  0.0825,  0.0462,  0.0360, -0.0564,  0.0232,  0.0732,\n",
              "          -0.0036,  0.0255, -0.0807, -0.0976, -0.0686, -0.0065,  0.0346, -0.0889,\n",
              "           0.0080,  0.0913, -0.0927,  0.0561,  0.0769,  0.0923,  0.0850,  0.0117,\n",
              "           0.0320, -0.0560,  0.0141,  0.0014,  0.0614,  0.0651,  0.0011, -0.0600,\n",
              "           0.0232,  0.0729, -0.0795,  0.0810,  0.0511, -0.0871,  0.0127, -0.0196,\n",
              "           0.0103,  0.0414,  0.0510,  0.0051,  0.0481,  0.0510,  0.0031, -0.0302,\n",
              "          -0.0436, -0.0089,  0.0826,  0.0511,  0.0689,  0.0864, -0.0994,  0.0869,\n",
              "           0.0487,  0.0845,  0.0785,  0.0694,  0.0204, -0.0600,  0.0911,  0.0864,\n",
              "           0.0692, -0.0835, -0.0380,  0.0579],\n",
              "         [ 0.0216,  0.0456,  0.0345, -0.0133, -0.0172,  0.0317, -0.0954, -0.0970,\n",
              "          -0.0487, -0.0784, -0.0253,  0.0002, -0.0736,  0.0209, -0.0818,  0.0979,\n",
              "           0.0177,  0.0938, -0.0003, -0.0752, -0.0608, -0.0845, -0.0590, -0.0140,\n",
              "           0.0932,  0.0594, -0.0421, -0.0334, -0.0560,  0.0230, -0.0984,  0.0108,\n",
              "          -0.0790,  0.0952,  0.0063, -0.0205, -0.0799, -0.0985, -0.0410,  0.0417,\n",
              "          -0.0295, -0.0558, -0.0096,  0.0253, -0.0506, -0.0268,  0.0039, -0.0376,\n",
              "          -0.0614,  0.0012, -0.0654,  0.0926, -0.0224, -0.0382,  0.0642,  0.0002,\n",
              "          -0.0595,  0.0082, -0.0098,  0.0803, -0.0137,  0.0736,  0.0951,  0.0468,\n",
              "           0.0265,  0.0647,  0.0697, -0.0800, -0.0389,  0.0197,  0.0702, -0.0968,\n",
              "           0.0254, -0.0813,  0.0090,  0.0708, -0.0979, -0.0089, -0.0328,  0.0438,\n",
              "          -0.0716, -0.0583,  0.0231,  0.0520, -0.0492,  0.0793,  0.0047, -0.0519,\n",
              "           0.0751,  0.0365, -0.0197, -0.0038,  0.0060,  0.0817, -0.0102, -0.0311,\n",
              "           0.0405,  0.0068,  0.0657,  0.0953],\n",
              "         [ 0.0525, -0.0420, -0.0952, -0.0102,  0.0392, -0.0176,  0.0287,  0.0707,\n",
              "           0.0136,  0.0040,  0.0319, -0.0198, -0.0673, -0.0032,  0.0384, -0.0691,\n",
              "           0.0868, -0.0097,  0.0566,  0.0280, -0.0372,  0.0711,  0.0132, -0.0885,\n",
              "           0.0103,  0.0145,  0.0067, -0.0120,  0.0144, -0.0009, -0.0086, -0.0097,\n",
              "           0.0973, -0.0551, -0.0369, -0.0086, -0.0746,  0.0795, -0.0169,  0.0986,\n",
              "           0.0445,  0.0688,  0.0697, -0.0393, -0.0753, -0.0601, -0.0596, -0.0016,\n",
              "          -0.0185, -0.0137,  0.0440, -0.0240,  0.0878, -0.0554,  0.0665,  0.0227,\n",
              "           0.0441, -0.0192,  0.0001, -0.0931, -0.0855,  0.0053, -0.0500, -0.0908,\n",
              "          -0.0419, -0.0116,  0.0808,  0.0036,  0.0669,  0.0343,  0.0035,  0.0886,\n",
              "           0.0495, -0.0432,  0.0876,  0.0461,  0.0961, -0.0868,  0.0873, -0.0567,\n",
              "          -0.0102,  0.0756, -0.0840, -0.0884, -0.0161,  0.0910,  0.0055,  0.0241,\n",
              "           0.0930, -0.0289,  0.0679, -0.0751, -0.0011, -0.0431,  0.0280, -0.0784,\n",
              "          -0.1000, -0.0148,  0.0386, -0.0401],\n",
              "         [-0.0156,  0.0680,  0.0873, -0.0235, -0.0592, -0.0418,  0.0897, -0.0640,\n",
              "           0.0682,  0.0293, -0.0202, -0.0512,  0.0142, -0.0677,  0.0755,  0.0470,\n",
              "           0.0145, -0.0247,  0.0774, -0.0100,  0.0806, -0.0699,  0.0582,  0.0235,\n",
              "           0.0981, -0.0382,  0.0995,  0.0109,  0.0215,  0.0260,  0.0150, -0.0605,\n",
              "           0.0594,  0.0739, -0.0037,  0.0609, -0.0261, -0.0514,  0.0288,  0.0488,\n",
              "          -0.0448, -0.0213,  0.0280,  0.0520, -0.0636, -0.0356,  0.0361,  0.0938,\n",
              "          -0.0469, -0.0118, -0.0459, -0.0840, -0.0942,  0.0947,  0.0792,  0.0806,\n",
              "           0.0562,  0.0466, -0.0872, -0.0060,  0.0183, -0.0419,  0.0178, -0.0429,\n",
              "           0.0357, -0.0383, -0.0302, -0.0071, -0.0351,  0.0143, -0.0025,  0.0831,\n",
              "          -0.0260,  0.0423, -0.0691, -0.0184,  0.0289,  0.0877,  0.0756, -0.0825,\n",
              "          -0.0233, -0.0892, -0.0006,  0.0259,  0.0185, -0.0302,  0.0505,  0.0191,\n",
              "          -0.0432, -0.0931,  0.0944, -0.0989,  0.0741,  0.0332, -0.0865, -0.0458,\n",
              "           0.0932, -0.0157, -0.0192, -0.0828]], requires_grad=True),\n",
              " Parameter containing:\n",
              " tensor([-0.0854, -0.0359,  0.0551,  0.0325,  0.0434, -0.0240,  0.0714, -0.0807,\n",
              "          0.0593,  0.0730], requires_grad=True)]"
            ]
          },
          "metadata": {},
          "execution_count": 12
        }
      ],
      "source": [
        "# 看看模型参数\n",
        "list(model.parameters())  # 这种方法拿到模型的所有可学习参数,requires_grad=True\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "ExecuteTime": {
          "end_time": "2024-07-17T03:06:34.677508500Z",
          "start_time": "2024-07-17T03:06:34.619793100Z"
        },
        "id": "Hbi_dIEAgMW1"
      },
      "outputs": [],
      "source": [
        "# model.state_dict()  # 这种方法用于保存模型参数，看能看见参数属于模型的哪一部分"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "mg9ajadWgMW2"
      },
      "source": [
        "## 训练\n",
        "\n",
        "pytorch的训练需要自行实现，包括\n",
        "1. 定义损失函数\n",
        "2. 定义优化器\n",
        "3. 定义训练步\n",
        "4. 训练"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 13,
      "metadata": {
        "ExecuteTime": {
          "end_time": "2024-07-17T03:06:34.678507600Z",
          "start_time": "2024-07-17T03:06:34.625324900Z"
        },
        "id": "fMIEk5aSgMW2"
      },
      "outputs": [],
      "source": [
        "# 1. 定义损失函数 采用交叉熵损失\n",
        "loss_fct = nn.CrossEntropyLoss() #内部先做softmax，然后计算交叉熵\n",
        "# 2. 定义优化器 采用SGD\n",
        "# Optimizers specified in the torch.optim package,随机梯度下降\n",
        "optimizer = torch.optim.SGD(model.parameters(), lr=0.001, momentum=0.9)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 14,
      "metadata": {
        "ExecuteTime": {
          "end_time": "2024-07-17T03:06:35.192587400Z",
          "start_time": "2024-07-17T03:06:34.637807300Z"
        },
        "id": "oGWS0qAIgMW2"
      },
      "outputs": [],
      "source": [
        "from sklearn.metrics import accuracy_score\n",
        "\n",
        "@torch.no_grad() # 装饰器，禁止反向传播，节省内存\n",
        "def evaluating(model, dataloader, loss_fct):\n",
        "    loss_list = [] # 记录损失\n",
        "    pred_list = [] # 记录预测\n",
        "    label_list = [] # 记录标签\n",
        "    for datas, labels in dataloader:#10000/32=312\n",
        "        datas = datas.to(device) # 转到GPU\n",
        "        labels = labels.to(device) # 转到GPU\n",
        "        # 前向计算\n",
        "        logits = model(datas)\n",
        "        loss = loss_fct(logits, labels)         # 验证集损失\n",
        "        loss_list.append(loss.item()) # 记录损失\n",
        "\n",
        "        preds = logits.argmax(axis=-1)    # 验证集预测,argmax返回最大值索引\n",
        "        # print(preds)\n",
        "        pred_list.extend(preds.cpu().numpy().tolist())#将PyTorch张量转换为NumPy数组。只有当张量在CPU上时，这个转换才是合法的\n",
        "        # print(preds.cpu().numpy().tolist())\n",
        "        label_list.extend(labels.cpu().numpy().tolist())\n",
        "\n",
        "    acc = accuracy_score(label_list, pred_list) # 计算准确率\n",
        "    return np.mean(loss_list), acc\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "outputs": [
        {
          "data": {
            "text/plain": "37500"
          },
          "execution_count": 25,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "1875*20"
      ],
      "metadata": {
        "ExecuteTime": {
          "end_time": "2024-07-17T03:06:35.201490200Z",
          "start_time": "2024-07-17T03:06:35.194584600Z"
        },
        "id": "eFwcE8WSgMW2",
        "outputId": "346ef52b-1eec-467b-c0cf-2a4a8d371483"
      }
    },
    {
      "cell_type": "code",
      "execution_count": 15,
      "metadata": {
        "ExecuteTime": {
          "end_time": "2024-07-17T03:17:13.841145200Z",
          "start_time": "2024-07-17T03:06:35.205487200Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 49,
          "referenced_widgets": [
            "1d8d3b3e86614b10ad0583d0e1bc32fa",
            "001ff8334b51484090858716094c4c52",
            "4b37b382b14b4f97998d9adb53f5e55e",
            "813666c9b7184f72b51dc2b546d6b156",
            "eefb2ebf5f514696a3823602ed4809c4",
            "48a8d60b6c6a4a4ea6271b436d69ac0f",
            "5b1cab0eb1674fe8b8f5b66a072f19a0",
            "f3bf0243d7044fa48133f65cc54f8bc3",
            "1c65a30bb86b4e2293def9068aab7f09",
            "576e45777026402e8cd58e24b687185d",
            "3694b3f4a085468489cd48c920562359"
          ]
        },
        "id": "UYsxEPIcgMW2",
        "outputId": "65c01731-4b9b-4ded-8e61-6a495ee9cb45"
      },
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "  0%|          | 0/37500 [00:00<?, ?it/s]"
            ],
            "application/vnd.jupyter.widget-view+json": {
              "version_major": 2,
              "version_minor": 0,
              "model_id": "1d8d3b3e86614b10ad0583d0e1bc32fa"
            }
          },
          "metadata": {}
        }
      ],
      "source": [
        "# 训练\n",
        "def training(model, train_loader, val_loader, epoch, loss_fct, optimizer, eval_step=500):\n",
        "    record_dict = {\n",
        "        \"train\": [],\n",
        "        \"val\": []\n",
        "    }\n",
        "\n",
        "    global_step = 0\n",
        "    model.train()\n",
        "    with tqdm(total=epoch * len(train_loader)) as pbar: # 进度条 1875*20,60000/32=1875\n",
        "        for epoch_id in range(epoch): # 训练epoch次\n",
        "            # training\n",
        "            for datas, labels in train_loader: #执行次数是60000/32=1875\n",
        "                datas = datas.to(device) #datas尺寸是[batch_size,1,28,28]\n",
        "                labels = labels.to(device) #labels尺寸是[batch_size]\n",
        "                # 梯度清空\n",
        "                optimizer.zero_grad()\n",
        "                # 模型前向计算\n",
        "                logits = model(datas)\n",
        "                # 计算损失\n",
        "                loss = loss_fct(logits, labels)\n",
        "                # 梯度回传，loss.backward()会计算梯度，loss对模型参数求导\n",
        "                loss.backward()\n",
        "                # 调整优化器，包括学习率的变动等,优化器的学习率会随着训练的进行而减小，更新w,b\n",
        "                optimizer.step() #梯度是计算并存储在模型参数的 .grad 属性中，优化器使用这些存储的梯度来更新模型参数\n",
        "\n",
        "                preds = logits.argmax(axis=-1) # 训练集预测\n",
        "                acc = accuracy_score(labels.cpu().numpy(), preds.cpu().numpy())   # 计算准确率，numpy可以\n",
        "                loss = loss.cpu().item() # 损失转到CPU，item()取值,一个数值\n",
        "                # record\n",
        "\n",
        "                record_dict[\"train\"].append({\n",
        "                    \"loss\": loss, \"acc\": acc, \"step\": global_step\n",
        "                }) # 记录训练集信息，每一步的损失，准确率，步数\n",
        "\n",
        "                # evaluating\n",
        "                if global_step % eval_step == 0:\n",
        "                    model.eval() # 进入评估模式\n",
        "                    val_loss, val_acc = evaluating(model, val_loader, loss_fct)\n",
        "                    record_dict[\"val\"].append({\n",
        "                        \"loss\": val_loss, \"acc\": val_acc, \"step\": global_step\n",
        "                    })\n",
        "                    model.train() # 进入训练模式\n",
        "\n",
        "                # udate step\n",
        "                global_step += 1 # 全局步数加1\n",
        "                pbar.update(1) # 更新进度条\n",
        "                pbar.set_postfix({\"epoch\": epoch_id}) # 设置进度条显示信息\n",
        "\n",
        "    return record_dict\n",
        "\n",
        "\n",
        "epoch = 20 #改为40\n",
        "model = model.to(device)\n",
        "record = training(model, train_loader, val_loader, epoch, loss_fct, optimizer, eval_step=1000)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 16,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "[{'loss': 0.3685890734195709, 'acc': 0.8125, 'step': 37495},\n",
              " {'loss': 0.3766030967235565, 'acc': 0.875, 'step': 37496},\n",
              " {'loss': 0.3395833373069763, 'acc': 0.875, 'step': 37497},\n",
              " {'loss': 0.22253893315792084, 'acc': 0.90625, 'step': 37498},\n",
              " {'loss': 0.3585969805717468, 'acc': 0.84375, 'step': 37499}]"
            ]
          },
          "metadata": {},
          "execution_count": 16
        }
      ],
      "source": [
        "record[\"train\"][-5:]"
      ],
      "metadata": {
        "ExecuteTime": {
          "end_time": "2024-07-17T03:19:11.487400800Z",
          "start_time": "2024-07-17T03:19:11.481402800Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "k6QMl1Y4gMW2",
        "outputId": "22a8080d-7826-462b-c381-4644b32a547e"
      }
    },
    {
      "cell_type": "code",
      "execution_count": 17,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "[{'loss': 0.37598417147089497, 'acc': 0.8677, 'step': 33000},\n",
              " {'loss': 0.3693117066598929, 'acc': 0.8674, 'step': 34000},\n",
              " {'loss': 0.35135574125872254, 'acc': 0.8741, 'step': 35000},\n",
              " {'loss': 0.35047039070639746, 'acc': 0.8753, 'step': 36000},\n",
              " {'loss': 0.3538181465059614, 'acc': 0.8725, 'step': 37000}]"
            ]
          },
          "metadata": {},
          "execution_count": 17
        }
      ],
      "source": [
        "record[\"val\"][-5:]"
      ],
      "metadata": {
        "ExecuteTime": {
          "end_time": "2024-07-17T03:19:46.400342200Z",
          "start_time": "2024-07-17T03:19:46.377355Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "VRuQ5RwXgMW2",
        "outputId": "b1157099-9e9c-43b7-bd29-88ef3b19235e"
      }
    },
    {
      "cell_type": "code",
      "execution_count": 18,
      "metadata": {
        "ExecuteTime": {
          "end_time": "2024-07-17T03:28:07.777109600Z",
          "start_time": "2024-07-17T03:28:07.518915700Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 1000
        },
        "id": "91BEY7COgMW2",
        "outputId": "acf29d59-2056-4363-f720-a35767fefb6f"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "step\n",
            "0        0.06250\n",
            "1000     0.78125\n",
            "2000     0.78125\n",
            "3000     0.84375\n",
            "4000     0.71875\n",
            "5000     0.84375\n",
            "6000     0.90625\n",
            "7000     0.84375\n",
            "8000     0.78125\n",
            "9000     0.81250\n",
            "10000    0.81250\n",
            "11000    0.84375\n",
            "12000    0.90625\n",
            "13000    0.93750\n",
            "14000    0.81250\n",
            "15000    0.90625\n",
            "16000    0.90625\n",
            "17000    0.90625\n",
            "18000    0.84375\n",
            "19000    0.93750\n",
            "20000    0.84375\n",
            "21000    0.78125\n",
            "22000    0.81250\n",
            "23000    0.84375\n",
            "24000    0.78125\n",
            "25000    0.96875\n",
            "26000    0.90625\n",
            "27000    0.93750\n",
            "28000    0.96875\n",
            "29000    0.93750\n",
            "30000    0.93750\n",
            "31000    0.90625\n",
            "32000    0.87500\n",
            "33000    0.90625\n",
            "34000    0.90625\n",
            "35000    0.90625\n",
            "36000    0.87500\n",
            "37000    0.84375\n",
            "Name: acc, dtype: float64\n",
            "step\n",
            "0        0.0740\n",
            "1000     0.6771\n",
            "2000     0.7611\n",
            "3000     0.8024\n",
            "4000     0.8143\n",
            "5000     0.8215\n",
            "6000     0.8289\n",
            "7000     0.8305\n",
            "8000     0.8299\n",
            "9000     0.8361\n",
            "10000    0.8399\n",
            "11000    0.8406\n",
            "12000    0.8466\n",
            "13000    0.8464\n",
            "14000    0.8514\n",
            "15000    0.8496\n",
            "16000    0.8534\n",
            "17000    0.8510\n",
            "18000    0.8570\n",
            "19000    0.8554\n",
            "20000    0.8616\n",
            "21000    0.8606\n",
            "22000    0.8622\n",
            "23000    0.8575\n",
            "24000    0.8651\n",
            "25000    0.8658\n",
            "26000    0.8673\n",
            "27000    0.8687\n",
            "28000    0.8653\n",
            "29000    0.8678\n",
            "30000    0.8651\n",
            "31000    0.8665\n",
            "32000    0.8734\n",
            "33000    0.8677\n",
            "34000    0.8674\n",
            "35000    0.8741\n",
            "36000    0.8753\n",
            "37000    0.8725\n",
            "Name: acc, dtype: float64\n"
          ]
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 1000x500 with 2 Axes>"
            ],
            "image/png": "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\n"
          },
          "metadata": {}
        }
      ],
      "source": [
        "#画线要注意的是损失是不一定在零到1之间的\n",
        "def plot_learning_curves(record_dict, sample_step=1000):\n",
        "    # build DataFrame\n",
        "    train_df = pd.DataFrame(record_dict[\"train\"]).set_index(\"step\").iloc[::sample_step]\n",
        "    val_df = pd.DataFrame(record_dict[\"val\"]).set_index(\"step\")\n",
        "    last_step = train_df.index[-1] # 最后一步的步数\n",
        "    # print(train_df.columns)\n",
        "    print(train_df['acc'])\n",
        "    print(val_df['acc'])\n",
        "    # plot\n",
        "    fig_num = len(train_df.columns) # 画几张图,分别是损失和准确率\n",
        "    fig, axs = plt.subplots(1, fig_num, figsize=(5 * fig_num, 5))\n",
        "    for idx, item in enumerate(train_df.columns):\n",
        "        # print(train_df[item].values)\n",
        "        axs[idx].plot(train_df.index, train_df[item], label=f\"train_{item}\")\n",
        "        axs[idx].plot(val_df.index, val_df[item], label=f\"val_{item}\")\n",
        "        axs[idx].grid() # 显示网格\n",
        "        axs[idx].legend() # 显示图例\n",
        "        axs[idx].set_xticks(range(0, train_df.index[-1], 5000)) # 设置x轴刻度\n",
        "        axs[idx].set_xticklabels(map(lambda x: f\"{int(x/1000)}k\", range(0, last_step, 5000))) # 设置x轴标签\n",
        "        axs[idx].set_xlabel(\"step\")\n",
        "\n",
        "    plt.show()\n",
        "\n",
        "plot_learning_curves(record)  #横坐标是 steps"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "g26EvjeFgMW3"
      },
      "source": [
        "## 评估"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 19,
      "metadata": {
        "ExecuteTime": {
          "end_time": "2024-07-17T03:17:16.674099900Z",
          "start_time": "2024-07-17T03:17:14.333157800Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "gY8xSECjgMW3",
        "outputId": "dcac291a-1e58-4782-9b61-221edae89e5e"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "loss:     0.3517\n",
            "accuracy: 0.8737\n"
          ]
        }
      ],
      "source": [
        "# dataload for evaluating\n",
        "\n",
        "model.eval() # 进入评估模式\n",
        "loss, acc = evaluating(model, val_loader, loss_fct)\n",
        "print(f\"loss:     {loss:.4f}\\naccuracy: {acc:.4f}\")"
      ]
    }
  ],
  "metadata": {
    "kernelspec": {
      "display_name": "Python 3",
      "name": "python3"
    },
    "language_info": {
      "codemirror_mode": {
        "name": "ipython",
        "version": 3
      },
      "file_extension": ".py",
      "mimetype": "text/x-python",
      "name": "python",
      "nbconvert_exporter": "python",
      "pygments_lexer": "ipython3",
      "version": "3.9.7"
    },
    "colab": {
      "provenance": [],
      "gpuType": "T4"
    },
    "accelerator": "GPU",
    "widgets": {
      "application/vnd.jupyter.widget-state+json": {
        "1d8d3b3e86614b10ad0583d0e1bc32fa": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HBoxModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "HBoxModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "HBoxView",
            "box_style": "",
            "children": [
              "IPY_MODEL_001ff8334b51484090858716094c4c52",
              "IPY_MODEL_4b37b382b14b4f97998d9adb53f5e55e",
              "IPY_MODEL_813666c9b7184f72b51dc2b546d6b156"
            ],
            "layout": "IPY_MODEL_eefb2ebf5f514696a3823602ed4809c4"
          }
        },
        "001ff8334b51484090858716094c4c52": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "HTMLModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "HTMLView",
            "description": "",
            "description_tooltip": null,
            "layout": "IPY_MODEL_48a8d60b6c6a4a4ea6271b436d69ac0f",
            "placeholder": "​",
            "style": "IPY_MODEL_5b1cab0eb1674fe8b8f5b66a072f19a0",
            "value": "100%"
          }
        },
        "4b37b382b14b4f97998d9adb53f5e55e": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "FloatProgressModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "FloatProgressModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "ProgressView",
            "bar_style": "success",
            "description": "",
            "description_tooltip": null,
            "layout": "IPY_MODEL_f3bf0243d7044fa48133f65cc54f8bc3",
            "max": 37500,
            "min": 0,
            "orientation": "horizontal",
            "style": "IPY_MODEL_1c65a30bb86b4e2293def9068aab7f09",
            "value": 37500
          }
        },
        "813666c9b7184f72b51dc2b546d6b156": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "HTMLModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "HTMLView",
            "description": "",
            "description_tooltip": null,
            "layout": "IPY_MODEL_576e45777026402e8cd58e24b687185d",
            "placeholder": "​",
            "style": "IPY_MODEL_3694b3f4a085468489cd48c920562359",
            "value": " 37500/37500 [08:47&lt;00:00, 84.45it/s, epoch=19]"
          }
        },
        "eefb2ebf5f514696a3823602ed4809c4": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "48a8d60b6c6a4a4ea6271b436d69ac0f": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "5b1cab0eb1674fe8b8f5b66a072f19a0": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "DescriptionStyleModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "StyleView",
            "description_width": ""
          }
        },
        "f3bf0243d7044fa48133f65cc54f8bc3": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "1c65a30bb86b4e2293def9068aab7f09": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "ProgressStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "ProgressStyleModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "StyleView",
            "bar_color": null,
            "description_width": ""
          }
        },
        "576e45777026402e8cd58e24b687185d": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "3694b3f4a085468489cd48c920562359": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "DescriptionStyleModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "StyleView",
            "description_width": ""
          }
        }
      }
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}